能否在Symfony中使用@required注解注入参数?
在Symfony中用@required注解直接注入参数的方案
在Symfony中有两种依赖注入方式:
- 通过
services.yml配置文件 - 使用
@required注解
目前我已经能通过@required轻松注入其他服务,示例代码如下:
class SomeClass { private LoggerInterface $logger; /** @required */ public function setLogger(LoggerInterface $logger) { $this->logger = $logger; } }
但我想知道是否可以通过这种方式直接注入参数?当前我采用注入整个容器的方式取参,但希望有更直接的实现:
class SomeClass { private array $configuration; /** @required */ public function setConfiguration(ContainerInterface $container) { $this->configuration = $container->getParameter('my_bundle.config'); } }
可行的直接注入方案
不需要注入整个容器,结合@required(或Symfony 5.1+的#[Required]属性)与@Autowire注解/属性,就能直接注入参数:
方案1:Setter注入参数(适配Symfony全版本)
// Symfony 5.1+ 用属性写法 use Symfony\Component\DependencyInjection\Attribute\Autowire; use Symfony\Component\DependencyInjection\Attribute\Required; class SomeClass { private array $configuration; #[Required] #[Autowire('%my_bundle.config%')] public function setConfiguration(array $configuration) { $this->configuration = $configuration; } }
如果是Symfony 5.1以下版本,用注解写法:
use Symfony\Component\DependencyInjection\Annotation\Autowire; class SomeClass { private array $configuration; /** * @required * @Autowire("%my_bundle.config%") */ public function setConfiguration(array $configuration) { $this->configuration = $configuration; } }
方案2:构造函数注入参数(推荐用于必需参数)
如果参数是类的必需依赖,更推荐构造函数注入,配合@required确保自动注入:
// Symfony 5.1+ 属性写法 use Symfony\Component\DependencyInjection\Attribute\Autowire; class SomeClass { private array $configuration; /** @required */ public function __construct( #[Autowire('%my_bundle.config%')] array $configuration ) { $this->configuration = $configuration; } }
以上两种方式都不需要依赖services.yml配置文件,直接实现参数的精准注入,避免了注入整个容器的冗余操作。
内容的提问来源于stack exchange,提问作者HubertNNN
相关产品推荐
相关产品推荐

