0

我有一个名为 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 注册之前注册的,因此它在正确的时间不存在。但我不知道如何改变这个顺序,或者这是否是一个可行的选择?

任何帮助表示赞赏。

4

1 回答 1

0

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

对于我的解决方法:

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

然后,为了在不使用 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);
   }

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

于 2020-05-06T09:54:41.187 回答