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

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

mybundle.service.supplier:
     class: AppBundleServiceSupplierService
     calls:
        - [setValidator, ['@validator']]

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

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

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

<?php

namespace AppBundleService;


use AppBundleEntitySupplier;
use AppBundleHelperEntityManagerTrait;
use SymfonyComponentHttpFoundationRequestStack;
use SymfonyComponentValidatorValidatorRecursiveValidator;

/**
 * Class SupplierService
 * @package AppBundleService
 */
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);

    }
}

2 ответов


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

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

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

  • Регистрация validator определение в XML Symfony:

    <service id="validator" class="Symfony\Component\Validator\Validator\ValidatorInterface">
        <factory service="validator.builder" method="getValidator" />
    </service>
    
  • Регистрация определению из validator.builder планшет:

    <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>
    
  • Регистрация заводе Symfony\Component\Validator\Validation::createValidatorBuilder. Он возвращает экземпляр ValidatorBuilder

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

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

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

надеюсь, что это помогает...


в symfony 3.4 просто так получилось:

Config:

stl.transaction.import.writer.insurance_company:
        class: STL\TransactionBundle\Import\Writer\InsuranceCompanyWriter
        public: false
        arguments:
            - '@validator'

вашим услугам:

use Symfony\Component\Validator\Validator\ValidatorInterface;
// ...
public function __construct(
        ValidatorInterface $validator,
    ) {
        $this->validator = $validator;
    }