Forms 表-I'的验证;我买了两次标签

Forms 表-I'的验证;我买了两次标签,forms,validation,symfony,twig,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_regist

我有一份登记表-来自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>
我刚刚从TwitterBootstrap添加了一些css类

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

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

我尝试打破尽可能多的验证规则,结果如下:

对于
用户名

  • 此用户名已被使用。请选择另一个
  • 用户名太短-请输入至少2个符号
  • 用户名太短-请输入至少2个符号
  • 对于
    电子邮件

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

  • 此电子邮件已被使用
  • 对于
    密码

    如果短:

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

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

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

    您是否知道为什么某些错误会显示两次以及如何修复?提前非常感谢!:)


    更新

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

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

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

    让我们看看这里:

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

    因此,对于validation.xml,仅修改实体(Acme\MyBundle\entity\User)的明文密码验证规则:


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

    是否从FOSUserBundle扩展用户实体,是否在扩展实体上重复验证规则?嗯,是的,我想我扩展了它。能否显示实体代码?如果重新定义验证规则,可能会出现双重错误消息…当然可以。我更新了我的问题。:)您更改了翻译文件中的最小长度??我想你改变了其他一些东西来实现这一点。。有什么想法吗?另外,您的捆绑包是否扩展了FOSUserBundle?非常感谢!:)现在它很完美,只是它不适用于使用破折号和RegistrationAcme编写的验证组,所以我将它们更改为
    [注册,默认值]
    [ProfileAcme,默认值]
    对于这个问题,我已经搜索了几个小时的解决方案,终于找到了一个好的、清晰的答案。您好@AlterPHP-您能帮我解决类似的问题吗?我尝试了类似于你上述答案的方法,但未能解决问题。很可能我做错了什么/遗漏了什么。
    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
        }
    }
    
    <?php
    
    namespace Acme\BudgetTrackerBundle;
    
    use Symfony\Component\HttpKernel\Bundle\Bundle;
    
    class AcmeBudgetTrackerBundle extends Bundle
    {
        public function getParent() 
        {
            return 'FOSUserBundle';
        }
    }
    
    <?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>
    
    fos_user:
        registration:
            form:
                validation_groups: [Default, RegistrationAcme]
        profile:
            form:
                validation_groups: [Default, ProfileAcme]
    
    # 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]
    # ...