有人可以告诉我如何使用依赖注入将验证器注入常规类。
在我的控制器中我有:
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
}
}
答案 0 :(得分:12)
为此,您的自定义类需要定义为服务,您将使用$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;
}
答案 1 :(得分:3)
来自Symfony2.5
Validator
被称为RecursiveValidator
,因此需要注射
use Symfony\Component\Validator\Validator\RecursiveValidator;
function __construct(RecursiveValidator $validator)
{
$this->validator = $validator;
}
答案 2 :(得分:0)
您的Form类可以继承ContainerAware(Symfony \ Component \ DependencyInjection \ ContainerAware)。然后您将可以访问容器,您将能够获得如下验证器服务:
$validator = $this->container->get('validator');
答案 3 :(得分:0)
在Symfony 4+中,如果使用默认配置(启用自动接线),最简单的方法是注入ValidatorInterface
。
例如:
<?php
use Symfony\Component\Validator\Validator\ValidatorInterface;
class MySuperClass
{
private $validator;
public function __construct(
ValidatorInterface $validator
) {
$this->validator = $validator;
}