Symfony2: зависимость между утверждениями проверки - PullRequest
1 голос
/ 03 апреля 2012

У меня есть классическая форма с полями: «имя пользователя», «пароль» и «день рождения».

Вот мои утверждения для проверки (в моей сущности пользователя):

.....

/**
 * @var string
 * @Assert\NotBlank(message="username.error.blank")
 * @Assert\MinLength(limit="2", message="username.error.short")
 */
protected $username;

/**
 * @var string
 * @Assert\NotBlank(message="password.error.blank")
 * @Assert\MinLength(limit="4", message="password.error.short")
 */
protected $password;

/**
 * @Assert\True(message="password.error.different")
 */
public function isPasswordLegal()
{
    return ($this->username != $this->password);
}

Проблема в том, что когда я отправляю форму, когда она полностью пуста:

  • 'username': сообщение об ошибке, потому что оно пустое (хорошо)
  • 'password': сообщение об ошибкепотому что оно пустое (хорошо)
  • 'пароль': сообщение об ошибке, потому что оно совпадает с именем пользователя (вот в чем проблема!)

Итак, 2 вопроса:

  1. Как решить эту проблему с «отображением»?
  2. Как отобразить это сообщение рядом с полем «пароль» с {{form_errors (form.password)}}?

Спасибо за вашу помощь: -)

Aurel

Ответы [ 2 ]

6 голосов
/ 29 мая 2012

Ответ 1: Используйте GroupSequence.

/**
 * @Assert\GroupSequence({"User", "Strict"})
 */
class User
{
    /**
     * @Assert\True(message="password.error.different", groups="Strict")
     */
    public function isPasswordLegal()
    {
        return ($this->username != $this->password);
    }

Сначала будут проверены все ограничения в группе «Пользователь». Только если все ограничения в этой группе действительны, будет проверена вторая группа, «Строгая», к которой я добавил ваш пользовательский метод проверки.

Чтобы объяснить, почему «Пользователь» содержит все другие ограничения, мне нужно пояснить немного подробнее:

  1. Каждое ограничение, которое не имеет явного набора groups, относится к группе "По умолчанию"
  2. Каждое ограничение, которое принадлежит группе «По умолчанию», также принадлежит группе «{ClassName}», то есть группе, названной так же, как класс, для которого определено ограничение (в нашем случае «Пользователь»).
  3. Когда вы проверяете объект в группе "{ClassName}", все ограничения в группе "{ClassName}" проверяются (то есть все ограничения в группе "Default")
  4. Когда вы проверяете объект в группе «По умолчанию», проверяются все ограничения в группе «По умолчанию», ЕСЛИ НЕ:
    • Класс определяет групповую последовательность. В этом случае группы в групповой последовательности будут проверяться по порядку.

Таким образом, групповые последовательности не могут содержать группу «По умолчанию» (это создаст цикл), но вместо этого должны содержать группу «{ClassName}».

Ответ 2: Используйте опцию «error_mapping» (только если на последнем мастере Symfony).

class UserType
{
    public function getDefaultOptions()
    {
        return array(
            'data_class' => '...\User',
            'error_mapping' => array(
                'passwordLegal' => 'password',
            ),
        );
    }
}
1 голос
/ 03 апреля 2012

A1.Это достаточно просто, хотя я думаю, что это может быть немного избыточно:

public function isPasswordLegal()
{
    // This is okay because the isBlank assert will fail
    if (!$this->password) return true;

    return ($this->username != $this->password);
}

A2.Что касается отображения, что-то вроде:

 {{ form_label (form.username) }}{{ form_widget(form.username) }}{{ form_errors(form.username) }}

 {{ form_label (form.password) }}{{ form_widget(form.password) }}{{ form_errors(form.password) }}

Стиль по мере необходимости.

...