Я пытаюсь использовать инъекцию зависимостей для пользовательского валидатора, чтобы иметь возможность использовать entityManager.
Я последовал примеру Symfony: Injection 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"
Где я ошибаюсь? Спасибо за помощь.
У вас неправильный служебный файл, когда вы добавляете теги и псевдоним, вы можете использовать имя «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, что класс validateBy method
для вашего ограничения isdoi
( validateBy method
). Однако ваш валидатор является IsDOIValidator
.
Вы должны использовать:
public function validateBy() { return "IsDOIValidator"; }
Однако, если ваше имя класса Constraint
IsDOI
, Symfony автоматически ищет IsDOIValidator
как ConstraintValidator
. Поведение по умолчанию для validateBy
заключается в добавлении «Validator» к имени ограничения и поиск класса с этим именем. Поэтому, если вы не перегрузите validateBy
, Symfony2 автоматически IsDOIValidator
поиск IsDOIValidator
.