【问题标题】:Symfony 3 - how to inject the validator into a service?Symfony 3 - 如何将验证器注入服务?
【发布时间】:2017-03-01 02:47:45
【问题描述】:

我尝试将验证器注入到我的服务中 - 但我没有找到它:

mybundle.service.supplier:
     class: AppBundle\Service\SupplierService
     calls:
        - [setValidator, ['@validator']]

@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);

    }
}

【问题讨论】:

    标签: php validation symfony


    【解决方案1】:

    @validator 是一个接口。

    这没有意义。如果它是一个接口,就不可能有Validator 服务的实例。是的,它确实实现了ValidatorInterface,但它不是。

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

    • 检查 Symfony 的 XML 中的validator 定义:

      <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)。

    希望这会有所帮助...

    【讨论】:

      【解决方案2】:

      在 symfony 3.4 中就像这样工作:

      配置:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-27
        • 2018-01-22
        • 1970-01-01
        • 2017-07-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多