I try to inject the validator into my service - but I don't find it:
mybundle.service.supplier:
class: AppBundle\Service\SupplierService
calls:
- [setValidator, ['@validator']]
the @validator is not the expected RecursiveValidator http://api.symfony.com/3.1/Symfony/Component/Validator/Validator/RecursiveValidator.html - the @validator is an interface.
So how can I inject the validator into my service?
This is what I want:
<?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);
}
}
@validator is an interface.
This does not make sense. If it would be an interface, there could not be an instacne of Validator
service. Yes, it does implement ValidatorInterface
, but it is not it.
On the other hand, I am sure you would get an instance of RecursiveValidator
. See my analyses:
Check the validator
definition in Symfony's XML:
<service id="validator" class="Symfony\Component\Validator\Validator\ValidatorInterface">
<factory service="validator.builder" method="getValidator" />
</service>
Check the definition of validator.builder
factory service:
<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>
Check the factory Symfony\Component\Validator\Validation::createValidatorBuilder
. It returns an instance of ValidatorBuilder
Finally, check the ValidatorBuilder::getValidator()
. It ends with the following:
return new RecursiveValidator($contextFactory, $metadataFactory, $validatorFactory, $this->initializers);
So, you will get the correct instance (RecursiveValidator
).
Hope this helps...
In symfony 3.4 simply like this worked:
Config:
stl.transaction.import.writer.insurance_company:
class: STL\TransactionBundle\Import\Writer\InsuranceCompanyWriter
public: false
arguments:
- '@validator'
Your service:
use Symfony\Component\Validator\Validator\ValidatorInterface;
// ...
public function __construct(
ValidatorInterface $validator,
) {
$this->validator = $validator;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With