0

Symfony2 クックブックのこのレシピの手順に従って、カスタム phone 制約を作成しました。

制約クラス:

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);
        }
      }
    }

このバリデーターは問題なく動作しますが、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)

しかし、validate メソッドはすでに ConstraintValidator クラスに実装されています (ただし、適切に実装されていれば、loadValidatorMetadata に示されているパターンで十分だと思います)。

どうすればこれを達成できるかについての提案はありますか?

アップデート:

正規表現制約が機能するために、すべてが適切に機能していたようです。制約クラスでパターンを設定した後、検証メソッドは次のようにバリデータ クラスで空として宣言できます。

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)
  {   
  }
}
4

1 に答える 1

2

エラーは、PhoneValidator ではなく CepValidator に対してスローされます。

別のファイルがあります...

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

... validate() メソッドがありません。

于 2013-06-17T07:30:18.453 に答える