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 / 路由 / 使用参数作为控制器或动作名称

symfony2 获取路由参数(控制器参数与请求)

Symfony 控制台应用程序:依赖注入

在 Symfony 3 中从控制器传递参数以形成 __construct 类型

Symfony 4,从控制器获取 .env 参数,是不是可能以及如何?

运行 PHPUnit 测试时,容器参数在 Symfony 5 服务中不可用/注入