Подтвердить что ты не робот

Проблема проверки валидатора групп в Symfony2

Я новичок в мире Symfony2. Я пытался изучить основы проверки в Symfony2, когда у меня возникла проблема с этим. Согласно руководству , чтобы правильно управлять последовательностью групп проверки, вы должны добавить эту строку аннотации в свой класс Entity:

/**
 * @Assert\GroupSequence({"User", "Strict"})
 */

И добавьте некоторую аннотацию, где бы вы ни хотели обработать правильное правило. В моем случае, а также в одном из руководств находится поле password, которое должно быть действительным только в том случае, если сначала оно скомпилировано (и уважает мои правила, такие как минимальная длина), а затем, если оно отличается от значения username. Проблема в том, что он не работает для меня!

Я имею в виду, что у меня есть тот же класс User, и я использовал ту же форму своего примера:

$form = $this->createFormBuilder($user, array('validation_groups' => array('signup','strict')))
        ->add('name', 'text')
        ->add('email', 'text')
        ->add('password', 'password')
        ->add('signup', 'submit')
        ->getForm();

Здесь мой класс User:

<?php

namespace XXX\SiteBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * User
 *
 * @ORM\Table(name="users")
 * @ORM\Entity
 * @Assert\GroupSequence({"User", "signup", "strict"}) 
 */
class User
{
    //..

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     * @Assert\NotBlank(groups={"signup"})
     * @Assert\Length(min=3,groups={"signup"})
     */
    private $name;

    /**
     * @var string
     *
     * @ORM\Column(name="password", type="string", length=255)
     * @Assert\NotBlank(groups={"signup"})
     * @Assert\Length(min=7,groups={"signup"})     
     */
    private $password;

    /**
     * @var string
     *
     * @ORM\Column(name="email", type="string", length=255)
     * @Assert\NotBlank(groups={"signup"})     
     * @Assert\Email(checkMX=true, groups={"signup"})     
     */
    private $email;

    /**
     * @Assert\True(groups={"strict"})
     */
    public function isPasswordLegal()
    {
        return $this->name != $this->password;
    }

    //..some getter\setter methods
}

Когда я отправляю форму без ввода значений в полях, она показывает мне каждую ошибку (и это правильно), а также ту, что isPasswordLegal() запускается, даже перед другими!

Что мне не хватает? Спасибо всем!

4b9b3361

Ответ 1

Причина, по которой ошибка отображается перед другими, используется как средство проверки методов, а Symfony присваивает сообщение об ошибке экземпляру формы, а не поле формы.

Edit:

Все формы предоставляют параметр error_mapping, который позволяет определить, где должны отображаться сообщения об ошибках.

В вашем случае это будет выглядеть так:

$options = array(
    'validation_groups' => array('signup','strict'),
    'error_mapping' => array(
        'isPasswordLegal' => 'password',
    ),
);
$form = $this->createFormBuilder($user, $options)
    ->add('name', 'text')
    ->add('email', 'text')
    ->add('password', 'password')
    ->add('signup', 'submit')
    ->getForm();