2016-08-26 39 views
0

我想知道是否有可能讓實體管理器在自定義驗證器中訪問存儲庫。獲取自定義驗證器中的實體管理器

我試圖將驗證器聲明爲服務並給出「@ doctrine.orm.default_entity_manager」參數。

但它當然不起作用,因爲很明顯,當我添加我的驗證器作爲實體中的註釋時,我不會調用服務。

有沒有辦法到達我的自定義驗證程序中的存儲庫,我通過實體中的註釋調用來驗證?

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

class UniqueKeyValidator extends ConstraintValidator { 
    public function validate($value, Constraint $constraint) { 
    $entity = $this->context->getRoot()->getData(); 
    ... calling entity repository ..... 
    } 
} 

我的服務:

app.validator.unique: 
    class: MyBundle\Validator\Constraints\UniqueKeyValidator 
    arguments: ["@doctrine.orm.default_entity_manager"] 
    tags: 
     - { name: validator.constraint_validator } 
+0

你可以發表你的驗證程序的代碼?包含配置 – Matteo

回答

2

是的,你可以register validator as a service。 Symfony將在它將要創建驗證器的實例時首先檢查服務容器。

這只是你可能忘記從的Symfony的文檔添加合適的標籤

例子:

services: 
    validator.contains_alphanumeric: 
     class: AppBundle\Validator\Constraints\ContainsAlphanumericValidator 
     tags: 
      - { name: validator.constraint_validator } 
+0

即使使用標籤,它也不起作用:傳遞給UniqueKeyValidator :: __ construct()的參數1必須是Doctrine \ ORM \ EntityManager的一個實例,沒有給出 – mlwacosmos

+0

已經添加了具有適當配置的'arguments'屬性來傳遞服務配置?我介紹的Symfony文檔中沒有包含這個例子。它只顯示如何將驗證器註冊爲服務。 –

+1

答案似乎在那裏http://stackoverflow.com/questions/14371267/custom-constraint-validator-with-database-connection-dependency-symfony2 – mlwacosmos