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;
}