Использование ограничения строки Regex вместо пользовательского ограничения в Symfony2

Я создал пользовательское ограничение телефона, следуя шагам, описанным в этом рецепте из кулинарная книга 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)
  {   
  }
}

person rfc1484    schedule 17.06.2013    source источник


Ответы (1)


Ошибка возникает для CepValidator, а не для PhoneValidator.

У вас есть другой файл...

src/Foo/Bundle/StackBundle/Validator/Constraints/CepValidator.php

... отсутствует метод validate().

person Nicolai Fröhlich    schedule 17.06.2013
comment
Вы правы, я не заметил, что ошибка связана с другим валидатором. - person rfc1484; 17.06.2013