Symfony 3 - как внедрить валидатор в сервис?

5

Я пытаюсь ввести валидатор в свою службу, но я не нахожу его:

mybundle.service.supplier:
     class: AppBundle\Service\SupplierService
     calls:
        - [setValidator, ['@validator']]

@validator не является ожидаемым рекурсивнымValidator http://api.symfony.com/3.1/Symfony/Component/Validator/Validator/RecursiveValidator.html - @validator - это интерфейс.

Итак, как я могу ввести валидатор в свою службу?

Это то, что я хочу:

<?php

namespace AppBundle\Service;


use AppBundle\Entity\Supplier;
use AppBundle\Helper\EntityManagerTrait;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Validator\Validator\RecursiveValidator;

/**
 * Class SupplierService
 * @package AppBundle\Service
 */
class SupplierService
{
    use EntityManagerTrait;

   /** @var RecursiveValidator $validator */
    protected $validator;

    /**
     * @return RecursiveValidator
     */
    public function getValidator()
    {
        return $this->validator;
    }

    /**
     * @param RecursiveValidator $validator
     * @return SupplierService
     */
    public function setValidator($validator)
    {
        $this->validator = $validator;

        return $this;
    }


    public function addSupplier($data)
    {
        $supplier = new Supplier();
        $validator = $this->getValidator();
        $errors = $validator->validate($supplier);

    }
}
Теги:
validation

1 ответ

7
Лучший ответ

@validator - это интерфейс.

Это не имеет смысла. Если это будет интерфейс, не может быть instacne службы Validator. Да, он реализует ValidatorInterface, но это не так.

С другой стороны, я уверен, что вы получите экземпляр RecursiveValidator. Смотрите мои анализы:

  • Проверьте определение Validator в Symfony XML:

    <service id="validator" class="Symfony\Component\Validator\Validator\ValidatorInterface">
        <factory service="validator.builder" method="getValidator" />
    </service>
    
  • Проверьте определение службы validator.builder factory:

    <service id="validator.builder" class="Symfony\Component\Validator\ValidatorBuilderInterface">
        <factory class="Symfony\Component\Validator\Validation" method="createValidatorBuilder" />
        <call method="setConstraintValidatorFactory">
            <argument type="service" id="validator.validator_factory" />
        </call>
        <call method="setTranslator">
            <argument type="service" id="translator" />
        </call>
        <call method="setTranslationDomain">
            <argument>%validator.translation_domain%</argument>
        </call>
    </service>
    
  • Проверьте factory Symfony\Component\Validator\Validation::createValidatorBuilder. Он возвращает экземпляр ValidatorBuilder

  • Наконец, проверьте ValidatorBuilder::getValidator(). Он заканчивается следующим:

    return new RecursiveValidator($contextFactory, $metadataFactory, $validatorFactory, $this->initializers);
    

Итак, вы получите правильный экземпляр (RecursiveValidator).

Надеюсь, что это поможет...

  • 0
    спасибо ... это помогло мне :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню