控制器构造函数中无法访问配置参数的问题咨询
在Symfony控制器构造函数中访问services.yaml参数的正确方式
可以在控制器构造函数中访问services.yaml里定义的参数,但你原来的写法存在问题——构造函数执行时,控制器依赖的ParameterBag还未完成初始化,调用$this->getParameter()会触发Call to a member function has() on null错误。
下面是两种正确的实现方式:
方式一:直接注入单个参数(推荐)
这是Symfony官方推荐的依赖注入方式,更清晰且符合单一职责原则。
- 在控制器构造函数中声明需要的参数:
namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; class YourController extends AbstractController { private string $foo; public function __construct(string $appFoo) { $this->foo = $appFoo; } // 后续方法中可直接使用$this->foo }
- 在
config/services.yaml中绑定参数名与配置值:
services: _defaults: autowire: true autoconfigure: true bind: # 将构造函数中的$appFoo变量绑定到app.foo参数 $appFoo: '%app.foo%'
如果仅需给单个控制器注入,也可以单独配置:
App\Controller\YourController: arguments: $appFoo: '%app.foo%'
方式二:注入ParameterBagInterface
如果需要访问多个参数,可直接注入ParameterBagInterface来获取所有配置参数:
namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; class YourController extends AbstractController { private string $foo; public function __construct(ParameterBagInterface $parameterBag) { $this->foo = $parameterBag->get('app.foo'); } }
这种方式无需额外配置services.yaml(只要开启了autowiring即可),ParameterBagInterface会被自动注入。
内容的提问来源于stack exchange,提问作者Rmy5
相关产品推荐
相关产品推荐

