Ответ 1: Используйте GroupSequence
.
/**
* @Assert\GroupSequence({"User", "Strict"})
*/
class User
{
/**
* @Assert\True(message="password.error.different", groups="Strict")
*/
public function isPasswordLegal()
{
return ($this->username != $this->password);
}
Сначала будут проверены все ограничения в группе «Пользователь». Только если все ограничения в этой группе действительны, будет проверена вторая группа, «Строгая», к которой я добавил ваш пользовательский метод проверки.
Чтобы объяснить, почему «Пользователь» содержит все другие ограничения, мне нужно пояснить немного подробнее:
- Каждое ограничение, которое не имеет явного набора
groups
, относится к группе "По умолчанию"
- Каждое ограничение, которое принадлежит группе «По умолчанию», также принадлежит группе «{ClassName}», то есть группе, названной так же, как класс, для которого определено ограничение (в нашем случае «Пользователь»).
- Когда вы проверяете объект в группе "{ClassName}", все ограничения в группе "{ClassName}" проверяются (то есть все ограничения в группе "Default")
- Когда вы проверяете объект в группе «По умолчанию», проверяются все ограничения в группе «По умолчанию», ЕСЛИ НЕ:
- Класс определяет групповую последовательность. В этом случае группы в групповой последовательности будут проверяться по порядку.
Таким образом, групповые последовательности не могут содержать группу «По умолчанию» (это создаст цикл), но вместо этого должны содержать группу «{ClassName}».
Ответ 2: Используйте опцию «error_mapping» (только если на последнем мастере Symfony).
class UserType
{
public function getDefaultOptions()
{
return array(
'data_class' => '...\User',
'error_mapping' => array(
'passwordLegal' => 'password',
),
);
}
}