Symfony2 - 在自定义验证器中调用EmailValidator

时间:2013-06-27 07:41:57

标签: php symfony symfony-2.3

我正在创建自定义验证程序约束来验证"联系人",这类似于" John Doe< jdoe@example.com>"。在Cookbook我创建了约束类:

之后
<?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来检查电子邮件是否有效。我不想重新发明轮子并使用我自己的正则表达式验证电子邮件。

尝试验证有效的联系人时,一切正常,但是,使用无效的电子邮件测试联系人(&#34; Gabriel Garcia&lt; infoinv4l1d3mai1.com&gt;&#34;),它会因PHP致命错误而崩溃:

  

致命错误:在第58行的/home/dev/myproject/vendor/symfony/symfony/src/Symfony/Component/Validator/Constraints/EmailValidator.php中的非对象上调用成员函数addViolation()< / p>

深入研究EmailValidator.php类,我发现问题与$ context(ExecutionContext)有关。这是EmailValidator.php的第58行:

$this->context->addViolation($constraint->message, array('{{ value }}' => $value));

似乎该类的上下文属性为null。谁知道为什么?我需要把它注射到某个地方吗?

提前致谢。

P.S。:我正在使用Symfony 2.3。不要注意正则表达式,我知道它可以好得多。它现在只是用于测试。

2 个答案:

答案 0 :(得分:4)

您可以直接使用约束

请参阅http://symfony.com/doc/current/book/validation.html

use Symfony\Component\Validator\Constraints\Email

$emailConstraint = new Email();

// use the validator to validate the value
$errorList = $this->get('validator')->validateValue(
    $email,
    $emailConstraint
);

最好的关注

答案 1 :(得分:4)

我认为最初的问题是在自定义验证器中使用EmailValidator,并且在这种情况下容器不可用,所以

$this->get('validator');

不起作用。看来海报唯一的问题是将EmailValidator addViolation放到正确的上下文中。这应该有效:

$emailValidator = new EmailValidator();
$emailValidator->initialize($this->context);
$emailValidator->validate($matches[2], $constraint);