【问题标题】:How to inject validator in Symfony如何在 Symfony 中注入验证器
【发布时间】:2012-09-17 15:46:31
【问题描述】:

谁能告诉我如何使用依赖注入将验证器注入到常规类中。

在我的控制器中,我有:

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Form;

class FormController extends Controller {
    public function indexAction()
    {
        $form = new Form();
        $email = $request->request->get('email');
        $valid = $form->isValid($email);
    }
}

我想使用这个自定义类 - 但我需要它可以访问验证器。

class Form {
    public function isValid($value)
    {
        // This is where I fail
        $validator = $this->get('validator'); 
        ... etc
    }
}

【问题讨论】:

    标签: symfony dependency-injection


    【解决方案1】:

    为此,您需要将自定义类定义为服务,并且您将使用$form = $this->get('your.form.service'); 从控制器访问它,而不是直接实例化它。

    定义你的服务时,确保注入验证器服务:

    your.form.service:
        class: Path\To\Your\Form
        arguments: [@validator]
    

    然后你需要在表单服务的构造方法中处理这个:

    /**
     * @var \Symfony\Component\Validator\Validator
     */
    protected $validator;
    
    function __construct(\Symfony\Component\Validator\Validator $validator)
    {
        $this->validator = $validator;
    }
    

    【讨论】:

    • 感谢您的全面回答,现在完全明白了!
    【解决方案2】:

    从 Symfony2.5 开始

    Validator 被称为RecursiveValidator 所以,用于注入

    use Symfony\Component\Validator\Validator\RecursiveValidator;
    function __construct(RecursiveValidator $validator)
    {
        $this->validator = $validator;
    }
    

    【讨论】:

      【解决方案3】:

      在 Symfony 4+ 中,如果您使用默认配置(启用自动连接),最简单的方法是注入 ValidatorInterface

      例如:

      <?php
      
      use Symfony\Component\Validator\Validator\ValidatorInterface;
      
      class MySuperClass
      {
          private $validator;
      
          public function __construct(
              ValidatorInterface $validator
          ) {
              $this->validator = $validator;
          }
      

      【讨论】:

        【解决方案4】:

        您的 Form 类可以继承自 ContainerAware (Symfony\Component\DependencyInjection\ContainerAware)。然后你就可以访问容器了,你就可以像这样获得验证器服务:

        $validator = $this->container->get('validator');
        

        【讨论】:

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