Symfony DI注入一个空数组而不是实体管理器对象

时间:2014-11-21 06:13:26

标签: symfony symfony-2.5

我正在尝试注入实体管理器对象介绍我的验证类,但Symfony DI注入一个空数组(使用var_dump测试)。我无法理解为什么这不起作用。这是我的一些代码。

应用程序/ 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。代码有什么问题吗?

1 个答案:

答案 0 :(得分: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