2016-10-19 27 views
5

staram się wstrzyknąć walidator do mojego serwisu - ale nie mam go znaleźć:Symfony 3 - jak wprowadzić walidator do usługi?

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

@validator nie jest oczekiwana RecursiveValidator http://api.symfony.com/3.1/Symfony/Component/Validator/Validator/RecursiveValidator.html - w @validator jest interfejsem.

Jak mogę wprowadzić weryfikator do mojej usługi?

To jest to, co chcę:

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

    } 
} 

Odpowiedz

6

@validator jest interfejsem.

To nie ma sensu. Jeśli byłby to interfejs, nie może być instacne usługi Validator. Tak, implementuje ona ValidatorInterface, ale to nie jest to.

Z drugiej strony, jestem pewien, że otrzymasz wystąpienie RecursiveValidator. Zobacz moje analizy:

  • zobacz definicja w XML Symfony za validator:

    <service id="validator" class="Symfony\Component\Validator\Validator\ValidatorInterface"> 
        <factory service="validator.builder" method="getValidator" /> 
    </service> 
    
  • Sprawdź definicję usługi validator.builder fabryczne:

    <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> 
    
  • Sprawdź fabrykę Symfony\Component\Validator\Validation::createValidatorBuilder. Zwraca instancję: ValidatorBuilder

  • Na koniec sprawdź numer ValidatorBuilder::getValidator(). Kończy się poniżej:

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

Więc dostaniesz właściwą instancję (RecursiveValidator).

Nadzieja to pomaga ...

+0

dzięki ... bardzo mi pomógł :) – goldlife