2016-10-19 29 views
5

benim hizmete doğrulayıcı enjekte etmek deneyin - ama bunu bulmuyorum:Symfony 3 - Doğrulayıcıyı bir servise nasıl enjekte edebilirsiniz?

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

@validator beklenen RecursiveValidator http://api.symfony.com/3.1/Symfony/Component/Validator/Validator/RecursiveValidator.html değil - @validator bir arayüzdür.

Doğrulayıcıyı hizmetime nasıl enjekte edebilirim?

Bu Benim istediğim:

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

    } 
} 

cevap

6

@validator bir arayüzdür.

Bu mantıklı değil. Bir arayüz olsaydı, Validator hizmetinin bir instacne olamazdı. Evet, ValidatorInterface'u uygular, ama öyle değil. Öte yandan

, sana RecursiveValidator bir örneğini alacağı eminim. Benim analizler bakınız:

  • Kontrol Symfony'nin XML validator tanım:

    <service id="validator" class="Symfony\Component\Validator\Validator\ValidatorInterface"> 
        <factory service="validator.builder" method="getValidator" /> 
    </service> 
    
  • validator.builder fabrika hizmetinin tanımını kontrol edin:

    <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> 
    
  • fabrika Symfony\Component\Validator\Validation::createValidatorBuilder edin. Bu Nihayet

  • ValidatorBuilder bir örneğini döndürür ValidatorBuilder::getValidator() kontrol edin. Bu aşağıda bitiyor:

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

Yani, doğru örneğini (RecursiveValidator) alacak.

Bu yardımcı olur umarım ...

+0

Teşekkürler ... bana yardımcı oldu :) – goldlife

İlgili konular