验证表格 - 我得到了两次标签

时间:2013-03-19 14:00:19

标签: forms validation symfony twig

我有一个注册表 - 来自FOSUserBundle,这是在模板中:

{% form_theme form 'AcmeMyBundle:Form:errors.html.twig' %}

   <form class="big-spacer" action="{{ path('fos_user_registration_register') }}" {{ form_enctype(form) }} method="POST" class="fos_user_registration_register">
        {{ form_widget(form) }}
        <div>
            <input class="btn little-spacer" type="submit" value="{{ 'registration.submit'|trans({}, 'FOSUserBundle') }}" />
        </div>
    </form>

以下是errors.html.twig

{% block field_errors %}
    {% spaceless %}

        {% if errors|length > 0 %}

            <ul class="little-spacer nav text-error">
                {% for error in errors %}
                    <li>{{loop.index}}. {{ error.messageTemplate|trans(error.messageParameters, 'validators') }}</li>
                {% endfor %}
            </ul>

        {% endif %}
    {% endspaceless %}
{% endblock field_errors %}

我刚从TwitterBootstrap添加了一些css类。

问题是我得到了一些验证消息两次。

我的表单有4个字段 - 用户名,电子邮件,密码,确认密码

我试图打破尽可能多的验证规则,这是输出:

Username

  1. 此用户名已被使用。请选择另一个。
  2. 用户名太短 - 请输入至少2个符号。
  3. 用户名太短 - 请输入至少2个符号。
  4. email

    1. 请输入有效的电子邮件。
    2. 请输入有效的电子邮件。
    3. 如果我输入已使用的电子邮件,则错误仅显示一次:

      1. 此电子邮件已被使用。
      2. 对于passwords

        如果它们很短:

        1. 密码太短 - 请输入至少6个符号。
        2. 密码太短 - 请输入至少6个符号。
        3. 如果他们不匹配:

          1. 输入的密码不匹配。
          2. 另一个奇怪的事情是,当我重新提交表单时,但它仍然无效,密码长度的通知只有一个:

            1. 密码太短 - 请输入至少6个符号。
            2. 在重新提交之前,他们是两个。

              您是否有任何想法为什么有些错误会被显示两次以及如何解决这个问题?非常感谢你提前! :)


              更新

              这是C:\xampp\htdocs\Project\src\Acme\MyBundle\Entity\User.php

              namespace Acme\MyBundle\Entity;
              
              use FOS\UserBundle\Entity\User as BaseUser;
              use Doctrine\ORM\Mapping as ORM;
              
              /**
               * @ORM\Entity
               * @ORM\Table(name="fos_user")
               */
              class User extends BaseUser
              {
                  /**
                   * @ORM\Id
                   * @ORM\Column(type="integer")
                   * @ORM\GeneratedValue(strategy="AUTO")
                   */
                  protected $id;
              
                  public function __construct()
                  {
                      parent::__construct();
                      // your own logic
                  }
              }
              

              C:\xampp\htdocs\Project\app\Resources\FOSUserBundle\translations\中,我复制了文件validators.en.yml并在其中删除了[-Inf, Inf]部分并更改了一些消息。

              我也覆盖了验证文件 - 我在这里复制了它:

              C:\xampp\htdocs\Project\src\Acme\MyBundle\Resources\config\validation.xml

              我只更改了密码的最小长度。其他所有内容与原始文件中的相同。

              我的包扩展了FOSUserBundle:

              C:\xampp\htdocs\Project\src\Acme\MyBundle\AcmeMyBundle.php此文件包含以下内容:

              <?php
              
              namespace Acme\BudgetTrackerBundle;
              
              use Symfony\Component\HttpKernel\Bundle\Bundle;
              
              class AcmeBudgetTrackerBundle extends Bundle
              {
                  public function getParent() 
                  {
                      return 'FOSUserBundle';
                  }
              }
              

2 个答案:

答案 0 :(得分:12)

好的,这是一个已知问题。

我们来看看https://github.com/symfony/symfony/issues/2605

解决方案是:为要覆盖的属性验证规则创建自己的验证组。在您的validation.xml中,只放置您想要一些不同规则的属性,并在新验证组上定义验证。

因此,对于validation.xml,只修改实体的plainPassword验证规则(Acme \ MyBundle \ Entity \ User):

<?xml version="1.0" ?>
<constraint-mapping xmlns="http://symfony.com/schema/dic/constraint-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/constraint-mapping
http://symfony.com/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd">

    <class name="Acme\MyBundle\Entity\User"> 

        <property name="plainPassword">
            <constraint name="NotBlank">
                <option name="message">fos_user.password.blank</option>
                <option name="groups">Registration</option>
            </constraint>
            <constraint name="Length">
                <option name="min">6</option>
                <option name="minMessage">fos_user.password.short</option>
                <option name="groups">
                    <value>RegistrationAcme</value>
                    <value>ProfileAcme</value>
                </option>
            </constraint>
        </property>
    </class> 

</constraint-mapping>

现在您必须声明您对受影响的表单(注册和配置文件)使用不同的验证组。幸运的是,FOSUserBundle是一个很好的实践示例,允许您在config.yml中覆盖它们:

fos_user:
    registration:
        form:
            validation_groups: [Default, RegistrationAcme]
    profile:
        form:
            validation_groups: [Default, ProfileAcme]

答案 1 :(得分:0)

# config.yml
# ...
fos_user:
    db_driver:     orm
    firewall_name: main
    user_class:    Acme\YourBundle\Entity\User
    registration:
        form:
            type: acme_user_registration
            validation_groups: [Registration]
# ... 

添加最后一行(“validation_groups:[Registration]”)只会导致一个错误。只有FOSUserBundle验证:“注册”。