2016-10-19 22 views
5

tôi cố gắng tiêm validator vào dịch vụ của tôi - nhưng tôi không tìm thấy nó:Symfony 3 - làm cách nào để đưa trình xác thực vào dịch vụ?

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

các @validator không phải là dự kiến ​​RecursiveValidator http://api.symfony.com/3.1/Symfony/Component/Validator/Validator/RecursiveValidator.html - các @validator là một giao diện.

Vậy làm cách nào tôi có thể đưa trình xác thực vào dịch vụ của mình?

Đây là những gì tôi muốn:

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

    } 
} 

Trả lời

6

@validator là một giao diện.

Điều này không có ý nghĩa. Nếu nó là một giao diện, thì không thể có một bản dịch của dịch vụ Validator. Có, nó thực hiện ValidatorInterface, nhưng nó không phải là nó.

Mặt khác, tôi chắc chắn bạn sẽ nhận được một phiên bản RecursiveValidator. Xem phân tích của tôi:

  • Kiểm tra validator định nghĩa trong XML Symfony của:

    <service id="validator" class="Symfony\Component\Validator\Validator\ValidatorInterface"> 
        <factory service="validator.builder" method="getValidator" /> 
    </service> 
    
  • Kiểm tra định nghĩa của dịch vụ validator.builder nhà máy:

    <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> 
    
  • Kiểm tra nhà máy Symfony\Component\Validator\Validation::createValidatorBuilder. Nó trả về một thể hiện của ValidatorBuilder

  • Cuối cùng, hãy kiểm tra ValidatorBuilder::getValidator(). Nó kết thúc với những điều sau đây:

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

Vì vậy, bạn sẽ nhận được dụ đúng (RecursiveValidator).

Hy vọng điều này sẽ giúp ...

+0

cảm ơn ... nó đã giúp tôi :) – goldlife

Các vấn đề liên quan