我正在創建一個自定義驗證器約束來驗證「聯繫人」,類似於「John Doe <[email protected]>」。繼Cookbook我創建了約束類:Symfony2 - 在自定義驗證程序中調用EmailValidator
<?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我的自定義驗證內部檢查該電子郵件是有效的。我不想重新發明輪子並使用我自己的正則表達式驗證電子郵件。當試圖驗證有效的接觸,但是,測試與無效的電子郵件聯繫人
一切都OK了(「加夫列爾·加西亞·<infoinv4l1d3mai1.com>」),它與一個PHP致命錯誤craches:
Fatal error: Call to a member function addViolation() on a non-object in /home/dev/myproject/vendor/symfony/symfony/src/Symfony/Component/Validator/Constraints/EmailValidator.php on line 58
挖掘到EmailValidator.php類,我已經意識到這個問題與$ context(ExecutionContext)有關。這裏是EmailValidator.php的第58行:
$this->context->addViolation($constraint->message, array('{{ value }}' => $value));
似乎該類的上下文屬性爲null。有人知道爲什麼我需要在某處注入它?
在此先感謝。
P.S .:我正在使用Symfony 2.3。不要關注正則表達式,我知道它可以更好。這只是爲了現在的測試。
如果我定義我的驗證作爲一項服務,我該如何注入EmailValidator?我已經做了一個應用程序/控制檯容器:調試,我看不到與它對應的服務... –
我編輯我的帖子。您不需要僅通過電子郵件限制對象提供服務來驗證您的電子郵件。 –
謝謝!最後,我將驗證器服務注入到自定義驗證器中,並用它來驗證「聯繫人」的電子郵件部分。 –