「John Doe <jdoe@example.com>」のような「連絡先」を検証するカスタム バリデータ制約を作成しています。クックブックに従って、制約クラスを作成しました。
<?php
namespace MyCompany\MyBundle\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
/**
* @Annotation
*/
class Contact extends Constraint
{
public $message = 'The string "%string%" is not a valid Contact.';
}
また、バリデーターも作成しました。
<?php
namespace MyCompany\MyBundle\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\EmailValidator;
class ContactValidator extends ConstraintValidator
{
public function validate($value, Constraint $constraint)
{
if (!preg_match('#(.*)\s+<(.*)>#', $value, $matches)) {
$this->context->addViolation($constraint->message, array('%string%' => $value));
}
$emailValidator = new EmailValidator();
if (isset($matches[2]) && $emailValidator->validate($matches[2], new Email())) {
$this->context->addViolation($constraint->message, array('%string%' => $value));
}
}
}
ポイントは、カスタムバリデーター内で Symfony の EmailValidator を使用して、メールが有効であることを確認しようとしていることです。車輪を再発明して、独自の正規表現を使用して電子メールを検証したくありません。
有効な連絡先を検証しようとするとすべて問題ありませんが、無効な電子メール ("Gabriel Garcia <infoinv4l1d3mai1.com>") を使用して連絡先をテストすると、PHP の致命的なエラーでクラッシュします。
致命的なエラー: 58 行目の /home/dev/myproject/vendor/symfony/symfony/src/Symfony/Component/Validator/Constraints/EmailValidator.php の非オブジェクトに対するメンバー関数 addViolation() の呼び出し
EmailValidator.php クラスを調べてみると、この問題は $context (ExecutionContext) に関連していることがわかりました。EmailValidator.php の 58 行目は次のとおりです。
$this->context->addViolation($constraint->message, array('{{ value }}' => $value));
クラスのコンテキスト属性が null のようです。誰でも理由を知っていますか?どこかに注入する必要がありますか?
前もって感謝します。
PS: Symfony 2.3 を使用しています。正規表現に注意を払わないでください。それがはるかに優れていることはわかっています。ただ今テスト用です。