Symfony2字段类型猜测:何时选择<textarea>(over&lt; input type =“text”&gt;)?

时间:2016-02-13 15:57:59

标签: forms symfony

&lt; p&gt;未声明字段类型带来的优势是Symfony推断出&lt; code&gt; required&lt; / code&gt;和&lt; code&gt; maxlength&lt; / code&gt;来自验证规则的属性,如下所述:&lt; a href =“http://symfony.com/doc/current/book/forms.html#field-type-options-guessing”rel =“nofollow”&gt; http: //symfony.com/doc/current/book/forms.html#field-type-options-guessing</a></p> &lt; p&gt;但是,我找不到让Symfony 2.8.2“猜测”的方法&lt; code&gt;&lt; textarea&gt;&lt; / code&gt;而不是&lt; code&gt;&lt; input type =“text”&gt;&lt; / code&gt; : - (小于/ p为H. &lt; p&gt;我的第一个想法是增加允许的长度,但即使使用&lt; code&gt;长度:max:100000&lt; / code&gt;在validation.yml中,Symfony不为所动,只给了我&lt; code&gt;&lt; input type =“text”maxlength =“100000”/>&lt; / code&gt;。&lt; / p&gt; &lt; p&gt;编辑:@chalasr:我说的是一个&lt; strong&gt;不&lt; / strong&gt;的实体映射到数据库。很抱歉没有提及之前!&lt; / p&gt;

1 个答案:

答案 0 :(得分:4)

FormBuilder通过检查实体中相应属性的映射中的类型来猜测字段类型。

使用text代替string作为列映射的typeFormBuilder将使用textarea而不是输入。

示例:

/**
 * @ORM\Column(type="text")
 */
protected $field;

使用$builder->add('field');输出:

<textarea id="entity_field" name="entity[field]" required="required"></textarea>

有关详细信息,请查看Symfony\Bridge\Doctrine\Form\DoctrineOrmTypeGuesser

<强>更新

因此,您不使用映射类。

查看FormBuilder,如您所见,如果找不到相应的Guesser,表单类型将为TextType(输入文字)。

否则,有3种不同的Guesser

由于您的类未映射,因此Symfony将使用ValidatorTypeGuesser来猜测您的字段类型。

Guesser会查找班级中的约束 例如,如果您的字段的Type约束类型为integer,则会使用NumberType并呈现输入类型number

我的第一个想法是使用具有较大最小长度的Length约束。

但是,经过多次尝试并在课堂上查看后,似乎永远不会猜到TextareaType,除非您的类已被映射且您的字段已text为类型(使用DoctrineTypeGuesser

因此,如果没有映射类,Symfony就无法从类型猜测中创建textarea

有关更多信息,请查看ValidatorTypeGuesser::guessTypeForConstraint

另请参阅文档的Form Type Guessing一章,其中展示了如何使用一个好的示例创建自己的TypeGuesser