2015-10-14 82 views
0

我想建立一個驗證器,將檢查數據庫的一些值。爲此,我需要在服務中注入entityManager,並給我的Validation方法提供一個別名,如Symfony官方文檔中所述。Symfony2自定義驗證與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' ...運行'容器被稱爲'doctrine.orm.default_entity_manager'。如果這不是問題,那麼我就像你一樣卡住 - 否則看起來很完美。 – Ragdata

+0

您是否嘗試清除緩存並重新啓動php? – jcroll

回答

0

@Ragdata - doctrine.orm.default_entity_manager主義\ ORM \ EntityManager的

實際上有2次失誤在我的代碼。

Calling of validatedBy() function

這個功能應該不IsSingleEntryValidator

Method name should be diferent

我調用該方法validateBy(),但正確的函數名稱應該是validatedBy()稱爲IsSingleEntry類中和

所以代碼應該看起來l IKE在此現在:您的控制檯上debug`命令,並確保你的:

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(); 
     } 
    } 
}