Symfony2自动生成的HTML5约束不起作用

时间:2013-10-24 18:42:51

标签: php html5 forms symfony

我正在尝试使用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

我错过了什么吗?

2 个答案:

答案 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;
    }
}