Я создал пользовательское ограничение телефона, следуя шагам, описанным в этом рецепте из кулинарная книга Symfony2.
Класс ограничения:
namespace Foo\Bundle\StackBundle\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
/**
* @Annotation
*/
class Phone extends Constraint
{
public $message = 'The Phone contains an illegal character';
}
Класс валидатора:
namespace Foo\Bundle\StackBundle\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
/**
* @Annotation
*/
class PhoneValidator extends ConstraintValidator
{
public function validate($value, Constraint $constraint)
{
$length = strlen($value);
if (is_null($value)) {
return;
}
if ( $length > 14 || ! preg_match("/\([1-9]{2}\) [0-9]{4}-[0-9]{4}/", $value)) {
$this->context->addViolation($constraint->message, array(), $value);
}
}
}
Этот валидатор работает нормально, однако я хотел бы использовать ограничение строки Regex предоставлено Symfony2.
Я попытался реализовать это в классе ограничений:
namespace Foo\Bundle\StackBundle\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @Annotation
*/
class Phone extends Constraint
{
public $message = 'The Phone contains an illegal character';
public static function loadValidatorMetadata(ClassMetadata $metadata)
{
$metadata->addPropertyConstraint('description', new Assert\Regex(array(
'pattern' => '/\([1-9]{2}\) [0-9]{4}-[0-9]{4}/'
)));
}
}
Но это дает мне фатальную ошибку с просьбой реализовать метод проверки:
Неустранимая ошибка: класс Foo\Bundle\StackBundle\Validator\Constraints\CepValidator содержит 1 абстрактный метод и поэтому должен быть объявлен абстрактным или реализовать остальные методы (Symfony\Component\Validator\ConstraintValidatorInterface::validate)
Но метод валидации уже реализован в классе ConstraintValidator (хотя при правильной реализации, я думаю, паттерна, указанного в loadValidatorMetadata, должно хватить).
Любые предложения о том, как я могу достичь этого?
ОБНОВЛЕНИЕ:
Кажется, что все работало правильно, чтобы ограничение Regex работало, после того, как вы установите шаблон в классе ограничения, метод проверки можно объявить пустым в классе валидатора следующим образом:
namespace Foo\Bundle\StackBundle\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
/**
* @Annotation
*/
class PhoneValidator extends ConstraintValidator
{
public function validate($value, Constraint $constraint)
{
}
}