【发布时间】:2020-05-05 20:39:50
【问题描述】:
我有一个名为 Jason/JasonSticksBundle 的 Bundle,在其中我有一个名为 StickController 的控制器。
我在 Jason/JasonSticksBundle/Resources/config/services.yaml 中定义了一个服务
Jason\JasonSticksBundle\Controller\StickController:
public: true
arguments: []
tags: ['controller.service_arguments']
我的 services.yaml 是通过 JasonSticksExtension->load() 加载的,我的 bundle 在 bundles.php 中注册。
捆绑包按原样工作。
但是
对于这个特定的项目,我想覆盖 StickController 中的一些方法,所以我试图“装饰”它。
在我的常规 services.yaml 的底部,因此我有以下内容:
App\Controller\StickController:
decorates: Jason\JasonSticksBundle\Controller\StickController
但我收到此错误
您请求了一个不存在的服务“Jason\JasonSticksBundle\Controller\StickController”。
最后,如果我运行
php bin/console debug:container
我可以看到我的服务
Jason\JasonSticksBundle\Controller\StickController Jason\JasonSticksBundle\Controller\StickController
我所能想象的是,我的 services.yaml 是在我的 StickBundle 注册之前注册的,因此它在正确的时间不存在。但我不知道如何改变它的顺序,或者这是否是一个可行的选择?
任何帮助表示赞赏。
【问题讨论】:
-
您的
App\Controller\StickController是公开的吗?谁在调用生成错误的容器? -
@AlessandroChiitolina 它是公开的,我并没有直接调用服务容器,只是试图在 services.yaml 中注册它的装饰。对不起,如果我误解了你的问题。如果您询问原始控制器服务是如何注册的,那么我使用扩展程序的 load() 方法为 bundle 加载 services.yaml
-
我做了一个小测试用例,确认了问题。我可以装饰另一个 App 控制器,也可以装饰我的测试包中的其他服务。我发现通过消除它可以编译的 controller.service_arguments 标记,但是对于控制器来说这当然没有多大帮助。可能会尝试 Symfony 松弛频道,甚至是 github 问题。
-
对不起,我重新提出我的第二个问题:你在装饰控制器时能看到错误的回溯吗?应该调用 Container(或 ContainerBuilder)
get、getDefinition或findDefinition。哪个类/对象在进行该调用?要查看回溯,您可以使用-vvv选项调用缓存清除命令。
标签: php symfony php-7.4 symfony-4.4