2015-01-23 4 views
0

Я создал специальный валидатор, чтобы проверить, нет ли электронной почты в двух таблицах базы данных.Doctrine EntityManager не вводится в пользовательский валидатор

namespace AgriHealth\AhpBundle\Validator\Constraints; 

use Symfony\Component\Validator\Constraint; 

/** 
* @Annotation 
*/ 
class UniqueEmailAll extends Constraint 
{ 
    public $message = 'This email is already in use'; 

    public function validatedBy() 
    { 
     return get_class($this).'Validator'; 
    } 
} 

namespace AgriHealth\AhpBundle\Validator\Constraints; 

use Symfony\Component\Validator\Constraint; 
use Symfony\Component\Validator\ConstraintValidator; 

class UniqueEmailAllValidator extends ConstraintValidator 
{ 
    private $entityManager; 

    public function __construct(EntityManager $entityManager) 
    { 
     $this->entityManager = $entityManager; 
    } 


    public function validate($value, Constraint $constraint) 
    { 
     $find1 = $this->entityManager->getRepository('AgriHealthAhpBundle:Vet')->findOneByEmail($value); 
     $find2 = $this->entityManager->getRepository('AgriHealthAhpBundle:Farmer')->findOneByEmail($value); 

     if ($find1 || $find2) { 
      // If you're using the new 2.5 validation API (you probably are!) 
      $this->context->buildViolation($constraint->message) 
       ->addViolation(); 
     } 
    } 
} 

Я пытаюсь привнести Doctrine Entity менеджер в валидатор, как так:

services: 
    validator.unique.UniqueEmailAll: 
     class: AgriHealth\AhpBundle\Validator\Constraints\UniqueEmailAllValidator 
     arguments: 
      entityManager: "@doctrine.orm.entity_manager" 
     tags: 
      - { name: validator.constraint_validator, alias: UniqueEmailAllValidator } 

Но это не похоже на работу:

Catchable Ошибка: Аргумент 1 передается to AgriHealth \ AhpBundle \ Validator \ Constraints \ UniqueEmailAllValidator :: __ construct() должен быть экземпляром AgriHealth \ AhpBundle \ Validator \ Constraints \ EntityManager, не указанным, вызываемым в/home/jochen/projects/ahp/trunk/vendor/symfony/Symfony/SRC/Symfony/Bundle/FrameworkBundle/Оценщик/Constra intValidatorFactory.php по линии 71 и определены в /home/jochen/projects/ahp/trunk/src/AgriHealth/AhpBundle/Validator/Constraints/UniqueEmailAllValidator.php линии 18

Что мне не хватает? В config.yml я не уверен, что служба должна быть вызвана. В Cookbook говорится о префиксе validator.unique, но я не понимаю, к чему относится уникальный?

ответ

5

Прежде всего в UniqueEmailAllValidator вы должны объявить использование EntityManager

namespace AgriHealth\AhpBundle\Validator\Constraints; 

use Doctrine\ORM\EntityManager; 
use Symfony\Component\Validator\ConstraintValidator; 
use Symfony\Component\Validator\Constraint; 

class UniqueEmailAllValidator extends ConstraintValidator 
{ 
... 
} 

Во-вторых, в UniqueEmailAll Определим функцию validatedBy как этот

class UniqueEmailAll extends Constraint 
{ 
    public $message = 'This email is already in use'; 

    public function validatedBy() 
    { 
     return 'unique.email.all.validator'; 
    } 
} 

И в services.yml файле сделать это

Это решит вашу проблему. Я не знаю, что не так со второй частью, которая вызывает эту проблему. Возможно, это связано с прописными буквами.