gol*_*ife 7 php validation symfony
我尝试将验证器注入我的服务 - 但我找不到它:
mybundle.service.supplier:
class: AppBundle\Service\SupplierService
calls:
- [setValidator, ['@validator']]
Run Code Online (Sandbox Code Playgroud)
@validator不是预期的RecursiveValidator 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);
}
}
Run Code Online (Sandbox Code Playgroud)
@validator是一个接口.
这根本不符合逻辑.如果它是一个接口,就不会有Validator
服务的instacne .是的,它确实实现了ValidatorInterface
,但事实并非如此.
另一方面,我相信你会得到一个实例RecursiveValidator
.看我的分析:
检查validator
Symfony的XML中的定义:
<service id="validator" class="Symfony\Component\Validator\Validator\ValidatorInterface">
<factory service="validator.builder" method="getValidator" />
</service>
Run Code Online (Sandbox Code Playgroud)检查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>
Run Code Online (Sandbox Code Playgroud)检查工厂Symfony\Component\Validator\Validation::createValidatorBuilder
.它返回一个实例ValidatorBuilder
最后,检查一下ValidatorBuilder::getValidator()
.它以下结尾:
return new RecursiveValidator($contextFactory, $metadataFactory, $validatorFactory, $this->initializers);
Run Code Online (Sandbox Code Playgroud)因此,您将获得正确的实例(RecursiveValidator
).
希望这可以帮助...