2016-10-19 6 views
5

は、私は私のサービスにバリデータを挿入しようとする - が、私はそれを見つけることができません:Symfony 3 - バリデーターをサービスに注入する方法は?

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

    } 
} 

答えて

6

@validatorはインターフェースです。

これは意味をなさない。それがインターフェイスであれば、Validatorサービスのインスタントは不可能です。はい、それはValidatorInterfaceを実装しますが、そうではありません。

一方、RecursiveValidatorのインスタンスを取得すると確信しています。私の分析を参照してください:工場Symfony\Component\Validator\Validation::createValidatorBuilderをチェック

<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> 
  • validator.builder工場サービスの定義を確認

    <service id="validator" class="Symfony\Component\Validator\Validator\ValidatorInterface"> 
        <factory service="validator.builder" method="getValidator" /> 
    </service> 
    
    • はsymfonyのXMLでvalidator定義を確認してください。 ValidatorBuilderのインスタンスを返します

    • 最後に、ValidatorBuilder::getValidator()を確認してください。それは次のように終わる:

      return new RecursiveValidator($contextFactory, $metadataFactory, $validatorFactory, $this->initializers); 
      

    だから、あなたは正しいインスタンス(RecursiveValidator)を取得します。

    これが役に立ったら...

  • +0

    ありがとう... it helped me :) – goldlife

    関連する問題