2014-11-21 61 views
0

我想注入一個實體管理器對象介紹我的驗證類,但是Symfony DI注入一個空數組(用var_dump測試)。我不明白爲什麼這不起作用。這裏有一些我的代碼。Symfony DI注入一個空數組而不是實體管理器對象

應用程序/ config.yml

services: 
    unique_booking_date_validator: 
     class: MyCompany\Bundle\AppBundle\Domain\Validator\UniqueBookingDate 
     arguments: 
      - "@doctrine.orm.entity_manager" 
     tags: 
      - { name: validator.constraint_validator, alias: unique_booking_date } 

我班

namespace MyCompany\Bundle\AppBundle\Domain\Validator; 

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

/** @Annotation */ 
class UniqueBookingDate extends Constraint 
{ 
    protected $em; 

    public function __construct(\Doctrine\ORM\EntityManager $em) 
    { 
     $this->em = $em; 
    } 
    public function validatedBy() 
    { 
     return 'unique_booking_date'; 
    } 

    ... 
} 

它返回此異常:

Catchable Fatal Error: Argument 1 passed to MyCompany\Bundle\AppBundle\Domain\Validator 
\UniqueBookingDate::__construct() must be an instance of Doctrine\ORM\EntityManager, 
array given, called in C:\htdocs\booking-manager\vendor\doctrine\annotations\lib\Doctrine\ 
Common\Annotations\DocParser.php on line 794 and defined in C:\htdocs\booking-manager 
\src\MyCompany\Bundle\AppBundle\Domain\Validator\UniqueBookingDate.php line 20 

我運行的Symfony v2.5.7。代碼有問題嗎?

+0

如果用'ConstraintValidator'擴展'UniqueBookingDate'會怎麼樣? – Nevertheless 2014-11-21 08:30:06

+0

@ Grimv01k我仍然有同樣的問題。似乎validator.constraint_validator標記沒有正確註冊我的自定義驗證程序,因爲我能夠通過注入了實體管理器的id獲取服務。 – dextervip 2014-11-21 08:41:54

+0

看起來你確實通過services.yml傳遞了一個空數組。我會嘗試重現,但也許定義orm就像'arguments:[@ doctrine.orm.entity_manager]'會做些什麼? – Nevertheless 2014-11-21 08:45:34

回答

1

這會失敗,因爲Symfony正在傳遞父類Constraint類預期的選項數組。

您需要將驗證程序分爲兩個類:一個註記類和一個用於實際驗證的類。

/** @Annotation */ 
class UniqueBookingDate extends Constraint 
{ 
    public function validatedBy() 
    { 
     return 'unique_booking_date_validator'; 
    } 
} 

現在設置一個名爲unique_booking_date_validator的服務,它進行實際驗證。在這裏你可以傳遞實體管理器和其他依賴關係。

class UniqueBookingDateValidator extends ConstraintValidator 
{ 
    protected $em; 

    public function __construct(\Doctrine\ORM\EntityManager $em) 
    { 
     $this->em = $em; 
    } 

    public function validate($value, Constraint $constraint) 
    { 
     // do validation here 
    } 
} 

所以你services.yml文件應該是這個樣子:

services: 
    unique_booking_date_validator: 
     class: MyCompany\Bundle\AppBundle\Domain\Validator\UniqueBookingDateValidator 
     tags: 
      - { name: validator.constraint_validator, alias: unique_booking_date_validator } 
     arguments: 
      - "@doctrine.orm.entity_manager" 

對於這個動作一個很好的例子,看看Symfony's UniqueEntity validator,或看看Symfony's Cookbook article

相關問題