2014-11-21 3 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

А что, если вы расширите 'UniqueBookingDate' с помощью' ConstraintValidator'? – Nevertheless

+0

@ Grimv01k У меня все еще такая же проблема. Кажется, тэг validator.constraint_validator не регистрирует мой пользовательский валидатор должным образом, потому что я могу получить услугу по идентификатору, в который вводится менеджер сущностей. – dextervip

+0

Похоже, вы действительно передаете пустой массив через services.yml. Я попытаюсь воспроизвести, но, возможно, определение orm как 'arguments: [@ doctrine.orm.entity_manager]' что-то сделает? – Nevertheless

ответ

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.

 Смежные вопросы

  • Нет связанных вопросов^_^