Symfony3.4控制器注册为服务触发弃用警告求助
解决Symfony控制器服务的私有服务弃用警告问题
我来帮你搞定这个Symfony的弃用警告!先给你拆解下问题原因,再给你两种可行的解决方案:
问题原因
你的Acme\ShopBundle\Controller\ProductListController被配置为私有服务(Symfony服务默认是私有的),而从Symfony 3.2开始,直接从容器中检查私有服务的存在、或者获取私有服务的行为被标记为弃用,到Symfony 4.0会完全失效。日志里的两条警告就是这个原因导致的——不管是你自己的代码,还是Symfony内部的某些逻辑,正在尝试直接从容器操作这个私有控制器服务。
解决方案
方案1:将控制器服务设为公开(快速临时解决)
如果你暂时不想重构代码,只是想消除警告,可以在services.yml里显式把这个服务设为public: true:
services: Acme\ShopBundle\Controller\ProductListController: class: Acme\ShopBundle\Controller\ProductListController arguments: ['@product_service'] public: true
方案2:改用依赖注入(推荐的最佳实践)
更符合Symfony设计理念的做法是避免直接从容器获取服务,改用依赖注入的方式传递控制器:
- 如果是其他服务需要使用这个控制器,不要让那个服务调用
$container->get('Acme\ShopBundle\Controller\ProductListController'),而是把控制器注入到该服务的构造函数中(在服务配置里添加对应的参数); - 如果是路由使用这个控制器,确保路由配置采用服务式控制器的写法,比如:
Symfony会自动处理控制器的依赖注入,不需要你手动从容器获取。# routing.yml示例 product_list: path: /products defaults: _controller: Acme\ShopBundle\Controller\ProductListController::indexAction
另外,虽然栈跟踪显示在vendor目录,但大概率是你的项目代码里存在调用$container->has()或$container->get()获取这个控制器的逻辑,建议搜索项目代码找到这些调用点,替换成依赖注入的方式,这样才能彻底解决问题。
内容的提问来源于stack exchange,提问作者cloakedninjas
相关产品推荐
相关产品推荐

