我的一个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
我面临的问题是“车库”。
答案 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
用于生成控制器。但是,如果任何控制器在构造函数中具有构造函数或接受参数,则它不应该适用。然后,您必须为该类型的控制器创建工厂。
希望这会对你有所帮助!