2015-10-14 3 views
0

Я пытаюсь создать валидатор, который будет проверять базу данных для некоторых значений. Для этого мне нужно ввести внутри службы entityManager и дать псевдоним моему методу проверки, как описано в официальной документации Symfony.Symfony2 Custom Validator с EntityManager не работает

Проблема заключается в том, что после того, как делать все по книге, которую я все еще получаю ошибку о том, что EntityManager равна нулю:

Catchable Fatal Error: Argument 1 passed to XXX\CommonBundle\Validator\Constraints\IsSingleEntryValidator::__construct() must be an instance of Doctrine\ORM\EntityManager, none given, called in /var/www/XXX/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Validator/ConstraintValidatorFactory.php on line 71 and defined

Моя служба:

XXX.validators.is_single_entry: 
    class: XXX\CommonBundle\Validator\Constraints\IsSingleEntryValidator 
    arguments: 
     - "@doctrine.orm.default_entity_manager" 
    tags: 
     - { name: validator.constraint_validator, alias: single_entry_validation } 

А класс валидатора:

class IsSingleEntryValidator extends ConstraintValidator 
{ 

    /** 
    * @var EntityManager 
    */ 
    protected $em; 

    /** 
    * Constructor 
    * 
    * @param EntityManager $em 
    */ 
    public function __construct(EntityManager $em) 
    { 
     $this->em = $em; 
    } 

    public function validate($value, Constraint $constraint) 
    { 
     ... 
    } 

    public function validateBy() 
    { 
     return 'single_entry_validation'; 
    } 
} 

И использование валидатора:

/** 
* @ORM\Column(name="is_primary", type="boolean", nullable=true) 
* @SiteAssert\IsSingleEntry(message="validator.single.entry") 
*/ 
protected $isPrimary; 
+2

Моя EntityManager зависимость называется '@ doctrine.orm.entity_manager' ... запустить' контейнер: команду debug' на консоли и убедитесь, что ваша называется 'doctrine.orm.default_entity_manager'. Если это не окажется проблемой, я так же застрял, как и ты - выглядит совершенно иначе. – Ragdata

+0

Вы пытались очистить кеш и перезапустить php? – jcroll

ответ

0

@Ragdata - doctrine.orm.default_entity_manager Doctrine \ ORM \ EntityManager

Есть на самом деле 2 ошибки в своем коде.

Calling of validatedBy() function

Эта функция должна быть вызвана внутри класса IsSingleEntry и не IsSingleEntryValidator

Method name should be diferent

я называю метод validateBy() но правильное имя функции должно быть validatedBy()

Таким образом, код должен выглядеть l икэ это сейчас:

IsSingleEntry

class IsSingleEntry extends Constraint 
{ 
    public $message = "The value already exists in the database"; 

    /** 
    * @return string 
    */ 
    public function validatedBy() 
    { 
     return 'single_entry_validation'; 
    } 
} 

IsSingleEntryValidator

class IsSingleEntryValidator extends ConstraintValidator 
{ 

    /** 
    * @var EntityManager 
    */ 
    protected $em; 

    /** 
    * Construct 
    * 
    * @param EntityManager $em 
    */ 
    public function __construct(EntityManager $em) 
    { 
     $this->em = $em; 
    } 

    /** 
    * Validate 
    * 
    * @param mixed $value 
    * @param Constraint $constraint 
    */ 
    public function validate($value, Constraint $constraint) 
    { 
     $oActiveExists = $this->em->getRepository('DatabaseBundle:Languages')->findOneByIsPrimary(true); 

     if ($oActiveExists) { 
      $this->context->buildViolation($constraint->message) 
       ->addViolation(); 
     } 
    } 
}