Symfony2-自定义验证器和依赖性注入


Symfony2 - Custom validator and dependancy injection

我正在尝试为自定义验证器使用依赖性注入,以便能够使用entityManager。

我遵循了Symfony示例:依赖注入,但我一直收到这个错误消息:

FatalErrorException:错误:在中找不到类"isdoi"/home/milos/workspace/merrin3/vendor/symfony/symfoy/src/symfony/Bundle/FrameworkBundle/Validator/ConstraintValidatorFactory.php68号线

以下是我的课程:

1.IsDOI类:

    <?php
    namespace Merrin'MainBundle'Validator'Constraints;
    use Symfony'Component'Validator'Constraint;
    /**
     * @Annotation
    */
    class IsDOI extends Constraint
    {
    public $message_publisher_DOI = 'The Publisher DOI abbreviation does not correspond to the DOI you filled in !';
    public $message_journal_DOI = 'No journal found with the DOI you filled in !';
    public $journal;
    public $doiAbbreviation;
     public function validatedBy() {
            return "isdoi";
        }
        public function getTargets()
        {
            return self::CLASS_CONSTRAINT;
        }
    }

2.IsDOIValidator类:

<?php
namespace Merrin'MainBundle'Validator'Constraints;
use Doctrine'ORM'EntityManager;
use Symfony'Component'Validator'Constraint;
use Symfony'Component'Validator'ConstraintValidator;
use Symfony'Component'DependencyInjection'ContainerBuilder;
class IsDOIValidator extends ConstraintValidator
{
    private $entityManager;
    public function __construct(EntityManager $entityManager)
    {
    $this->entityManager = $entityManager;
    }
    public function validate($value, Constraint $constraint)
    {       
        $em_mdpipub = $this->entityManager('mdpipub');
        //Do some tests here...
    }
}

3.服务:

merrin.main.validator.isdoi:
    class:  Merrin'MainBundle'Validator'Constraints'IsDOIValidator
    arguments: 
        entityManager: "@doctrine.orm.entity_manager"

我哪里错了?谢谢你的帮助。

您有错误的服务文件,当您添加标签和别名时,您可以使用"isdoi"名称

merrin.main.validator.isdoi:
    class:  Merrin'MainBundle'Validator'Constraints'IsDOIValidator
    arguments: 
        entityManager: "@doctrine.orm.entity_manager"
    tags:
        - { name: validator.constraint_validator, alias: isdoi }

您告诉Symfony2约束的验证器类是isdoivalidateBy method)。但是,您的验证器是IsDOIValidator

您必须使用:

public function validateBy()
{
    return "IsDOIValidator";
}

但是,如果您的Constraint类名是IsDOI,Symfony将自动查找IsDOIValidator作为ConstraintValidatorvalidateBy的默认行为是将"Validator"附加到约束名称,并查找具有此名称的类。因此,如果不重载validateBy,Symfony2将自动搜索IsDOIValidator