【问题标题】:Symfony2 autogenerated HTML5 constraints does not workSymfony2 自动生成的 HTML5 约束不起作用
【发布时间】:2023-03-18 04:05:01
【问题描述】:

我正在尝试使用 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 HTML 用于客户端验证input 元素上的属性。但是没有pattern属性,生成的代码如下:

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

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

我错过了什么吗?

【问题讨论】:

  • 我在 Symfony 2.5 中仍然存在这个问题。你解决了吗?
  • @Paulpro 基本上,Symfony 开发人员告诉我,这种行为是故意的,并且在您手动设置表单类型时发生,从我的 POV 来看这是毫无意义的:github.com/symfony/symfony/issues/3661

标签: php html forms symfony


【解决方案1】:

你能不能试试下面的代码:

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

【讨论】:

    【解决方案2】:

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

    看Symfony源码,pattern等HTML5验证都是通过guessers添加的,并且只在createBuilderForProperty下调用,只有当builder属性typeNULL@时才使用指定了 987654322@ 和 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)).*">
    

    【讨论】:

      猜你喜欢
      • 2015-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多