Symfony 控制器作为服务参数未注入
Posted
技术标签:
【中文标题】Symfony 控制器作为服务参数未注入【英文标题】:Symfony controller as a service argument not injected 【发布时间】:2015-09-08 15:31:36 【问题描述】:我有这个控制器:
use Doctrine\Common\Persistence\ManagerRegistry;
class AjaxEntityController
protected $registry;
public function __construct(ManagerRegistry $registry)
$this->registry = $registry;
...
这是我的 services.yml:
services:
tapir_form.ajax_entity_controller:
class: Tapir\FormBundle\Controller\AjaxEntityController
arguments: [ '@doctrine' ]
但是当我尝试访问这个控制器(通过它的 URL)时,我得到了这个错误:
类型错误:传递给 Tapir\FormBundle\Controller\AjaxEntityController::__construct() 的参数 1 必须实现接口 Doctrine\Common\Persistence\ManagerRegistry,没有给出,在 /..../var/cache/dev/ 中调用jms_diextra/controller_injectors/TapirFormBundleControllerAjaxEntityController.php 第 13 行
我已经搜索过这个问题,发现很多情况下控制器没有声明为服务或缺少 arguments 参数,但不是我的情况。
我清除了缓存,将@Route(service="tapir_form.ajax_entity_controller") 添加到我的控制器类中,以防万一。当然我有我的 TapirFormExtension
$loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('services.yml');
如果我从构造函数中删除强制参数,则服务可以工作(我的意思是调用控制器操作,没有例外)。 这是我第一次将控制器用作服务。其他服务(如表单类型)使用类似的配置。
我正在使用 Symfony 2.7.3、PHP 5.6.13、Linux。
还有什么问题?
提前致谢。
【问题讨论】:
您需要更改您的路由信息以将控制器指定为服务:symfony.com/doc/current/cookbook/controller/… 正如@Cerad 所说...您的问题是您可能在routing.yml
文件中定义了路由,后来您在@Route
注释中定义了服务..
就是Cerad,谢谢!我在 routing.yml 中使用“Bundle:Controller:action”而不是“servicename:method”。
【参考方案1】:
从 Symfony 3.3 开始,您可以使用自动装配:
# app/services/services.yml
services:
Tapir\FormBundle\Controller\AjaxEntityController:
autowire: true
或者对于更多控制器,PSR-4 service autodiscovery:
# app/services/services.yml
services:
_defaults:
autowire: true
Tapir\:
resource: src/Tapir/Controller
【讨论】:
以上是关于Symfony 控制器作为服务参数未注入的主要内容,如果未能解决你的问题,请参考以下文章
Symfony2 / 路由 / 使用参数作为控制器或动作名称
在 Symfony 3 中从控制器传递参数以形成 __construct 类型