表单验证 - 我越来越标签两次(Validation of a form - I'm get

2019-07-22 00:21发布

我有一个登记表 - 从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个符号。

对于email

  1. 请输入有效电子邮件。
  2. 请输入有效电子邮件。

如果我输入已经使用的电子邮件,显示只有一次的错误:

  1. 此邮箱已被占用。

而对于passwords

如果他们是短:

  1. 该密码太短 - 请输入至少6个符号。
  2. 该密码太短 - 请输入至少6个符号。

如果它们不匹配:

  1. 输入的密码不匹配。

另一个奇怪的是,当我提交表单,但它仍然是无效的,对于密码的长度通知只有一个:

  1. 该密码太短 - 请输入至少6个符号。

并重新提交之前,他们两个。

你有为什么一些错误显示两次,如何解决这一问题的任何想法? 非常感谢你提前! :)


UPDATE

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

Answer 1:

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

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

解决的办法是:创建要覆盖性能验证规则自己的验证组。 在你的validation.xml,你想要一些不同的规则只放属性,并在新的验证组定义的验证。

因此,对于validation.xml中,修改为您的实体(ACME \ MyBundle \实体\用户)只有plainPassword验证规则:

<?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]


Answer 2:

# 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:[注册]”)的结果仅在一个错误。 只有FOSUserBundle验证:“注册”。



文章来源: Validation of a form - I'm getting the labels two times