9

有人可以告诉我如何使用依赖注入将验证器注入到常规类中。

在我的控制器中,我有:

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
    }
}
4

4 回答 4

14

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

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

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

然后,您需要在 Form 服务的构造方法中处理此问题:

/**
 * @var \Symfony\Component\Validator\Validator
 */
protected $validator;

function __construct(\Symfony\Component\Validator\Validator $validator)
{
    $this->validator = $validator;
}
于 2012-09-17T16:07:20.207 回答
3

从 Symfony2.5 开始

Validator如此称呼RecursiveValidator,用于注射

use Symfony\Component\Validator\Validator\RecursiveValidator;
function __construct(RecursiveValidator $validator)
{
    $this->validator = $validator;
}
于 2015-09-03T12:19:00.503 回答
3

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

例如:

<?php

use Symfony\Component\Validator\Validator\ValidatorInterface;

class MySuperClass
{
    private $validator;

    public function __construct(
        ValidatorInterface $validator
    ) {
        $this->validator = $validator;
    }
于 2019-06-26T10:35:30.003 回答
0

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

$validator = $this->container->get('validator');
于 2012-09-17T16:14:05.200 回答