【问题标题】:Overriding Controller in Symfony 4.4 (Decorates) - "You have requested a non-existent service"Symfony 4.4(装饰)中的覆盖控制器 - “你请求了一个不存在的服务”
【发布时间】: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)getgetDefinitionfindDefinition。哪个类/对象在进行该调用?要查看回溯,您可以使用 -vvv 选项调用缓存清除命令。

标签: php symfony php-7.4 symfony-4.4


【解决方案1】:

我找到了解决方法,但没有解决。这绝对不是这样做的方法 - 装饰的存在是有原因的,我不确定为什么我不能让它工作,所以任何关于它的建议仍然会受到赞赏。

对于我的解决方法:

我从我的 Bundles services.yaml 中删除了我的控制器定义,并编辑了我的 ConfigTreeBuilder 的我的 bundles 配置类以包含一个 scalarNode 字段以允许传递类名 - 这个类名将是控制器来覆盖 bundles .

然后,为了在不使用 services.yaml 的情况下注册控制器服务,我修改了我的 JasonStickExtension 类,并在加载 services.yaml 文件后(其他服务仍然需要)我添加了以下内容:

$stickControllerDefinition = $container->findDefinition('Jason\JasonSticksBundle\Controller\StickController');
$stickControllerDefinition->addTag("controller.service_arguments");
$stickDec = $config['stick_controller_class'];
  if($stickDec!=null) {
      $stickControllerDefinition->setClass($stickDec);
   }

这是一种直接的方式,正如我所说,我真的不认为这是正确的方式。

【讨论】:

    猜你喜欢
    • 2014-03-17
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 2021-12-23
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    相关资源
    最近更新 更多