2

entityManager を使用できるようにするために、カスタム バリデータに依存性注入を使用しようとしています。

Symfony Example: Dependency Injectionに従いましたが、常に次のエラー メッセージが表示されます。

FatalErrorException: エラー: クラス 'isdoi' が /home/milos/workspace/merrin3/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Validator/ConstraintValidatorFactory.php 行 68 に見つかりません

ここに私のクラスがあります:

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"

どこが間違っていますか?ご協力ありがとうございました。

4

2 に答える 2

7

サービス ファイルが間違っています。タグとエイリアスを追加すると、「isdoi」名を使用できます

merrin.main.validator.isdoi:
    class:  Merrin\MainBundle\Validator\Constraints\IsDOIValidator
    arguments: 
        entityManager: "@doctrine.orm.entity_manager"
    tags:
        - { name: validator.constraint_validator, alias: isdoi }
于 2013-07-16T08:47:58.263 に答える
3

You're telling Symfony2 that the validator class for your constraint is isdoi (validateBy method). However, your validator is IsDOIValidator.

You must use :

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

However, if your Constraint class name is IsDOI, Symfony will automatically look for IsDOIValidator as a ConstraintValidator. The default behavior for validateBy is to append "Validator" to the constraint name, and look for the class with this name. So if you do not overload validateBy, Symfony2 will automatically search for IsDOIValidator.

于 2013-07-16T08:40:14.097 に答える