我正在尝试使用Symfony2(v2.3.6)创建一个表单,并利用自动生成的HTML5约束。
所以,我创建了一个非常简单的表单,只有一个字段带有RegEx
约束:
public function formAction()
{
$form = $this->createFormBuilder()->add('animalName', 'text', array(
'constraints' => new \Symfony\Component\Validator\Constraints\Regex('/(cat|dog)/')
))->getForm();
if ($this->getRequest()->isMethod('POST')) {
$form->bind($this->getRequest());
}
return $this->render('MeTestBundle:Default:form.html.twig', array('form' => $form->createView()));
}
而且,在Twig中,没有任何异常。
{% extends "::base.html.twig" %}
{% block body %}
{{ form(form) }}
{% endblock %}
好吧,作为最终结果,我希望animalName
字段的pattern
属性值为(cat|dog)
。正如它在this link中所说的那样,Symfony将生成此约束的htmlPattern
(我测试了它,它返回.*(cat|dog).*
,这没关系),这个属性将用于客户端验证在pattern
元素上使用input
HTML属性。但是没有pattern
属性,生成的代码如下:
<input type="text" id="form_animalName" name="form[animalName]" required="required" />
经过一番研究后,我认为负责猜测pattern
属性的值是Symfony\Component\Form\Extension\Validator\ValidatorTypeGuesser
,但是这个服务从未被初始化(我在它的构造函数中写了die
并且还强制容器获取服务以检查是否达到die
。
我错过了什么吗?
答案 0 :(得分:0)
您可以尝试以下代码:
$form = $this->createFormBuilder()
->add('animalName', 'text', array(
'pattern' => '/(cat|dog)/'
))
->getForm();
我收到的HTML:
<div id="form">
<div><label for="form_animalName" class="required">Animal name</label>
<input type="text" id="form_animalName" name="form[animalName]" required="required" pattern="/(cat|dog)/">
</div>
<input type="hidden" id="form__token" name="form[_token]" value="kAg4Ww2oH9WQX6fPSyvJd4pNx-xE7B4G0NbIXtUWWDY">
</div>
我得到了答案: https://github.com/symfony/symfony/issues/3766 请查看它以获取更多信息。
答案 1 :(得分:0)
在寻求自己解决问题时,尽管遇到了一个老问题,但我发现我会将自己的发现发布给其他任何寻找原因的人。
查看Symfony源代码,pattern
和其他HTML5验证仅通过guessers
添加,并且仅在createBuilderForProperty
下调用,仅在构建器属性{{ 1}}是type
source code,并且指定了NULL
。从2.0到3.4似乎一直存在-我没有研究4.x。
要解决此问题,您将需要排除显式data_class
并指定一个type
模型来保存所需的约束验证。然后Symfony将使用guessers
确定要添加到HTML5元素的类型和属性。
表单生成器
data_class
数据类模型
$form = $this->createFormBuilder(null, ['data_class' => AnimalModel::class])
->add('animalName')
->getForm();
结果
use Symfony\Component\Validator\Constraints as Assert;
class AnimalModel
{
/**
* @Assert\Regex(pattern="/(cat|dog)/")
*/
private $animalName;
public function getAnimalName()
{
return $this->animalName;
}
public function setAnimalName($name)
{
$this->animalName = $name;
return $this->animalName;
}
}