forms - 表单验证 - 我收到了两次标签

标签 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 :
  • 此用户名已被使用。请选择另一个。
  • 用户名太短 - 请至少输入 2 个符号。
  • 用户名太短 - 请至少输入 2 个符号。

  • 对于 email :
  • 请输入有效电子邮件。
  • 请输入有效电子邮件。

  • 如果我输入已使用的电子邮件,则错误仅显示一次:
  • 此邮箱已被占用。

  • 而对于 passwords :

    如果它们很短:
  • 密码太短 - 请至少输入 6 个符号。
  • 密码太短 - 请至少输入 6 个符号。

  • 如果它们不匹配:
  • 输入的密码不匹配。

  • 另一个奇怪的是,当我重新提交表单时,但仍然无效,密码长度的通知只有一个:
  • 密码太短 - 请至少输入 6 个符号。

  • 在重新提交之前,他们是两个。

    您知道为什么某些错误会显示两次以及如何解决此问题吗?非常感谢您提前! :)

    更新

    这是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';
        }
    }
    

    最佳答案

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

    让我们看看这里: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]
    

    关于forms - 表单验证 - 我收到了两次标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15501569/

    相关文章:

    validation - 在CloudFormation模板中设置所需的参数输入

    php - symfony2 Doctrine 在不创建完整结果数组的情况下获取

    javascript - 如何在 AngularJS 中以编程方式触发表单提交?

    php - 使用后数组数据创建必须单独执行的多个表单

    java - Java 中的表单填写验证

    php - 在 Controller symfony2 中返回 Html

    php - 在 Symfony2 assetic 中加载 JS 文件的顺序

    php - 通过具有未知数量字段的表单进行解析

    jquery - 使 jQuery AJAX 具有非 javascript(非 ajax)后备?

    c# - 验证引发异常的 CQS 系统