Fae*_*ery 7 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>
Run Code Online (Sandbox Code Playgroud)
这是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 %}
Run Code Online (Sandbox Code Playgroud)
我刚从TwitterBootstrap添加了一些css类.
问题是我得到了一些验证消息两次.
我的表单有4个字段 - 用户名,电子邮件,密码,确认密码
我试图打破尽可能多的验证规则,这里是输出:
用于Username:
用于email:
如果我输入已使用的电子邮件,则错误仅显示一次:
对于passwords:
如果它们很短:
如果他们不匹配:
另一个奇怪的事情是,当我重新提交表单时,但它仍然无效,密码长度的通知只有一个:
在重新提交之前,他们是两个.
你有什么想法为什么一些错误显示两次以及如何解决这个问题?非常感谢你提前!:)
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
}
}
Run Code Online (Sandbox Code Playgroud)
在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';
}
}
Run Code Online (Sandbox Code Playgroud)
Alt*_*PHP 13
好的,这是一个已知问题.
我们来看看: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>
Run Code Online (Sandbox Code Playgroud)
现在,您必须声明对受影响的表单(注册和配置文件)使用不同的验证组.幸运的是,FOSUserBundle是一个很好的实践示例,允许您在config.yml中覆盖它们:
fos_user:
registration:
form:
validation_groups: [Default, RegistrationAcme]
profile:
form:
validation_groups: [Default, ProfileAcme]
Run Code Online (Sandbox Code Playgroud)