创建一个自定义类型猜测器
编辑本页警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 3.3,现已不再维护。
读本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。
创建一个自定义类型猜测器
Form组件可以通过使用类型猜测器来猜测表单字段的类型和一些选项。该组件已经包含了使用Validation组件断言的类型猜测器,但是您还可以添加自己的自定义类型猜测器。
在桥上形成类型猜测
欧宝娱乐app下载地址Symfony还在桥接中提供了一些表单类型猜测:
- PropelTypeGuesser由Propel1桥架提供;
- DoctrineOrmTypeGuesser由教义桥提供。
创建一个PHPDoc类型猜测器
在本节中,您将构建一个猜测器,从属性的PHPDoc中读取有关字段的信息。首先,您需要创建一个实现FormTypeGuesserInterface.该接口需要四个方法:
- guessType ()
- 尝试猜测字段的类型;
- guessRequired ()
- 的值要求选择;
- guessMaxLength ()
-
的值
最大长度
输入属性; - guessPattern ()
-
的值
模式
输入属性。
首先创建类和这些方法。接下来,你将学习如何填写每一个:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/ / src / AppBundle /形式/ TypeGuesser / PHPDocTypeGuesser.php名称空间AppBundle\形式\TypeGuesser;使用欧宝娱乐app下载地址\组件\形式\FormTypeGuesserInterface;类PHPDocTypeGuesser实现了FormTypeGuesserInterface{公共函数guessType($类,$财产){}公共函数guessRequired($类,$财产){}公共函数guessMaxLength($类,$财产){}公共函数guessPattern($类,$财产){}}
猜类型
的实例时,该方法返回TypeGuess或者什么都没有,以确定类型猜测器不能猜测类型。
的TypeGuess
构造函数需要三个选项:
- 类型名称(类型之一表单类型);
- 其他选项(例如,当类型为
实体
,你也要设置类
选项)。如果没有猜到类型,则应将其设置为空数组; - 猜测类型是正确的置信度。这可以是其中一个常数猜一猜类:
LOW_CONFIDENCE
,MEDIUM_CONFIDENCE
,HIGH_CONFIDENCE
,VERY_HIGH_CONFIDENCE
.在执行了所有类型猜测之后,将使用置信度最高的类型。
有了这些知识,您就可以轻松地实现guessType ()
方法PHPDocTypeGuesser
:
12 34 56 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
名称空间AppBundle\形式\TypeGuesser;使用欧宝娱乐app下载地址\组件\形式\猜一猜\猜一猜;使用欧宝娱乐app下载地址\组件\形式\猜一猜\TypeGuess;使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\TextType;使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\IntegerType;使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\NumberType;使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\CheckboxType;类PHPDocTypeGuesser实现了FormTypeGuesserInterface{公共函数guessType($类,$财产){$注释=$这->readPhpDocAnnotations ($类,$财产);如果(!收取($注释[“var”))) {返回;//如果@var注释不可用,什么也不猜}//否则,基于@var注释的类型开关($注释[“var”) {情况下“字符串”://有一个很高的置信度,类型是文本时// @var字符串返回新TypeGuess (TextType::类,数组(),猜::HIGH_CONFIDENCE);情况下“int”:情况下“整数”://整数也可以是实体的id或复选框(0或1)返回新TypeGuess (IntegerType::类,数组(),猜::MEDIUM_CONFIDENCE);情况下“浮”:情况下“双”:情况下“真实”的:返回新TypeGuess (NumberType::类,数组(),猜::MEDIUM_CONFIDENCE);情况下“布尔”:情况下“bool”:返回新TypeGuess (CheckboxType::类,数组(),猜::HIGH_CONFIDENCE);默认的://有一个非常低的信心,这个是正确的返回新TypeGuess (TextType::类,数组(),猜::LOW_CONFIDENCE);}}受保护的函数readPhpDocAnnotations($类,$财产){$reflectionProperty=新\ ReflectionProperty ($类,$财产);$phpdoc=$reflectionProperty->getDocComment ();//将$phpdoc解析为如下数组://数组('var' => 'string', 'since' => '1.0')$phpdocTags=……;返回$phpdocTags;}/ /……}
这个类型猜测器现在可以猜测属性的字段类型,如果它有PHPdoc!
猜测字段选项
其他三种方法(guessMaxLength ()
,guessRequired ()
和guessPattern ()
)返回ValueGuess实例使用该选项的值。这个构造函数有两个参数:
- 期权的价值;
- 方法的常量,对猜测值是正确的置信度
猜一猜
类)。
零
当您认为不应该设置选项的值时,就会猜测。
谨慎
你应该非常小心地使用guessPattern ()
方法。当类型为浮点数时,不能使用它来确定浮点数的最小值或最大值(例如,您希望浮点数大于5
,4.512313
是无效的长度(4.512314)>长度(5)
是,因此该模式将成功)。在这种情况下,值应该设置为零
与一个MEDIUM_CONFIDENCE
.
注册一个类型猜测器
如果你在使用自动装配和可以使用autoconfigure,你完蛋了!欧宝娱乐app下载地址Symfony已经知道并且正在使用您的表单类型猜测器。
如果你不使用自动连接和自动配置,手动注册您的服务并标记它form.type_guesser
:
- YAML
- XML
- PHP
1 2 3 4 5 6
# app / config / services.yml服务:#……AppBundle \ \ TypeGuesser \ PHPDocTypeGuesser形式:标签:(form.type_guesser)
12 3 4 5 6 7 8 9 10 11 12 13
<!——app/config/services.xml——> .xml<??> . xml version="1.0" encoding="UTF-8"<容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><服务id=“AppBundle \ \ TypeGuesser \ PHPDocTypeGuesser形式”><标签的名字=“form.type_guesser”/>服务>服务>容器>
1 2 3 4 5 6
/ / app / config / services.php使用AppBundle\形式\TypeGuesser\PHPDocTypeGuesser;$容器->注册(PHPDocTypeGuesser::类)->addTag (“form.type_guesser”);
3.3
在Symfony 欧宝娱乐app下载地址3.3之前,您需要将类型猜测服务定义为公共
.从Symfony 3.3开始欧宝娱乐app下载地址,您还可以将它们定义为私人
.
在组件中注册一个类型猜测器
如果在PHP项目中单独使用Form组件,请使用addTypeGuesser ()或addTypeGuessers ()的FormFactoryBuilder
注册新的类型猜测者:
1 2 3 4 5 6 7 8 9
使用欧宝娱乐app下载地址\组件\形式\形式;使用Acme\形式\PHPDocTypeGuesser;$formFactory=形式::createFormFactoryBuilder ()/ /……->addTypeGuesser (新PHPDocTypeGuesser ())->getFormFactory ();/ /……