2

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

好吧,作为最终结果,我期待animalNamefield 有一个patternvalue 属性(cat|dog)正如它在这个链接中所说的,Symfony 会生成htmlPattern这个约束(我测试过它,它返回.*(cat|dog).*,这没问题),并且这个属性将通过在元素上使用patternHTML 属性用于客户端验证。input但是没有pattern属性,生成的代码如下:

<input type="text" id="form_animalName" name="form[animalName]" required="required" />

经过一番研究,我认为猜测pattern属性值的责任是Symfony\Component\Form\Extension\Validator\ValidatorTypeGuesser,但该服务从未初始化(我在其中编写了一个die构造函数,还强制容器获取服务以检查是否die已到达)。

我错过了什么吗?

4

2 回答 2

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 请查看它以获取更多信息。

于 2014-11-23T02:33:32.943 回答
0

在寻求自己解决问题的同时,我遇到了这个问题,尽管它很老,但我想我会将我的发现发布给其他人寻找原因。

查看 Symfony 源代码,pattern和其他 HTML5 验证仅通过添加,guessers并且仅在 下调用createBuilderForProperty,仅在 builder 属性typeNULL 源代码data_class指定时使用。从 2.0 到 3.4 它似乎是持久的——我没有研究 4.x。

要解决此问题,您需要排除显式type并指定一个data_class包含所需约束验证的模型。然后 Symfony 将使用guessers来确定要添加到 HTML5 元素的类型和属性。

表单生成器

$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;
    }
}

结果

<!-- {{ form(form) }} -->
<input type="text" id="form_animalName" name="form[animalName]" pattern=".*((cat|dog)).*">
于 2018-09-01T06:30:49.487 回答