Symfony PHPUnit:解决直接获取validator服务的弃用提示
在PHPUnit测试中通过依赖注入使用Validator服务
问题背景
在PHPUnit测试的setUp()方法中直接从容器获取validator服务:
$this->validator = static::$kernel->getContainer()->get('validator');
会收到弃用提示:
Accessing the "validator" service directly from the container is deprecated, use dependency injection instead.
以下是两种正确的依赖注入改造方式:
方式1:构造函数注入(Symfony 6.1+ 推荐)
直接在测试类的构造函数中声明ValidatorInterface依赖,框架会自动完成注入:
use Symfony\Component\Validator\Validator\ValidatorInterface; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; class YourTest extends KernelTestCase { public function __construct( private readonly ValidatorInterface $validator, ?string $name = null, array $data = [], $dataName = '' ) { parent::__construct($name, $data, $dataName); } public function testValidation(): void { // 直接使用注入的validator实例 $errors = $this->validator->validate($yourTestObject); // 编写断言逻辑 $this->assertEmpty($errors); } }
方式2:通过接口类型从容器获取(兼容旧版本Symfony)
如果使用的是Symfony 6.0及以下版本,可在setUp()中通过接口类型而非字符串服务ID获取实例:
use Symfony\Component\Validator\Validator\ValidatorInterface; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; class YourTest extends KernelTestCase { private ValidatorInterface $validator; protected function setUp(): void { parent::setUp(); self::bootKernel(); // 使用接口类型获取服务,替代字符串'service' $this->validator = self::$container->get(ValidatorInterface::class); } public function testValidation(): void { $errors = $this->validator->validate($yourTestObject); $this->assertEmpty($errors); } }
关键说明
- 避免直接使用字符串服务ID(如
'validator')获取服务,改用对应接口类型,既符合依赖注入规范,也能获得类型提示支持。 - 构造函数注入是Symfony 6.1+的推荐方式,无需手动启动内核和获取容器,代码更简洁。
内容的提问来源于stack exchange,提问作者cheryllium
相关产品推荐
相关产品推荐

