错误的控制器被加载

时间:2017-11-11 16:22:05

标签: zend-framework3

我的一个Zend Framework 3应用程序中存在以下问题。我在两个不同的模块中有相同的控制器名称。

Module1\Controller\StartController
Module2\Controller\StartController

module.config.php 文件中,我有这个路由器配置:

'router' => [
    'routes' => [
        'module1' => [
            'type'    => Segment::class,
            'options' => [
                'route' => '/module1[/:controller[/:action[/:id]]]',
                'constraints' => [
                    'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                    'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                    'id'     => '[0-9]+'
                ],
                'defaults' => [
                    'controller' => Controller\StartController::class,
                    'action'     => 'index',
                ],
            ],
        ],
    ],  // ROUTES END HERE
],

现在我的问题是当我调用 / module1 / start 时会加载 Module2 \ Controller \ StartController 。我假设这是因为第二个模块的别名稍后定义并覆盖第一个条目。是否可以在此数组的 defaults 部分中定义默认命名空间? 或者什么是我的问题的正确解决方案?

更新: 我现在将两个配置文件添加到phpfiddle。你可以在这里找到它们: http://main.xfiddle.com/ac5762d7/module1.txt http://main.xfiddle.com/ac5762d7/module2.txt

我面临的问题是“车库”。

1 个答案:

答案 0 :(得分:0)

我可能错了!但我想你可能正在为两个模块使用相同的路由名称

'router' => [
    'routes' => [
        'module1' => [ // <-- check this name for both modules
            'type'    => Segment::class,
            ....
        ],
    ],
],

通常ZF3会在 LIFO (后进先出)订单中加载这些路线。因此,最常匹配的路由应首先注册最后和最不常见的路由。

您可以尝试更改模块名称,以便在合并到config/modules.config.php

时合并路线堆栈
return [
    ....

    'Module2',
    'Module1',
];

因为 Module2 首先合并,所以 Module1&#39; 路由应首先工作(例如,在此特定情况下),同时为两个模块使用相同的路由名称。 LIFO 订单。

<强>编辑:

不要使用相同的名称来创建服务名称或别名。在这种情况下,最好使用完全限定的类名。尝试使用别名的唯一名称。尝试使用控制器工厂,如下所示:

'controllers' => [
    'factories' => [
        Controller\StartController::class => InvokableFactory::class,
    ],
],

ZF3在需要时提供此InvokableFactory::class用于生成控制器。但是,如果任何控制器在构造函数中具有构造函数或接受参数,则它不应该适用。然后,您必须为该类型的控制器创建工厂。

希望这会对你有所帮助!