Symfony 3 - 如何将验证器注入服务?

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)

Jov*_*vic 9

@validator是一个接口.

这根本不符合逻辑.如果它是一个接口,就不会有Validator服务的instacne .是的,它确实实现了ValidatorInterface,但事实并非如此.

另一方面,我相信你会得到一个实例RecursiveValidator.看我的分析:

  • 检查validatorSymfony的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).

希望这可以帮助...