Zend framework2 Zend Framework 2 DI别名,不同模块中的相同控制器名称

Zend framework2 Zend Framework 2 DI别名,不同模块中的相同控制器名称,zend-framework2,Zend Framework2,我有一个包含3个模块和路由配置的应用程序,如下所示: admin.domain.tld/[:controller[:/action]=>admin rest.domain.tld/[:controller[:/id]=>rest domain.tld/[:controller[:/action]=>站点 并为每个模块中的所有控制器设置DI别名 REST模块DI别名: 'alias' => array( 'index' => 'Rest\Controller\IndexCo

我有一个包含3个模块和路由配置的应用程序,如下所示:

  • admin.domain.tld/[:controller[:/action]=>admin
  • rest.domain.tld/[:controller[:/id]=>rest
  • domain.tld/[:controller[:/action]=>站点
并为每个模块中的所有控制器设置DI别名

REST模块DI别名:

'alias' => array(
    'index' => 'Rest\Controller\IndexController',
    ...
),
'alias' => array(
    'index' => 'Admin\Controller\IndexController',
    ...
),
'alias' => array(
    'index' => 'Site\Controller\IndexController',
    ...
),
管理模块DI别名:

'alias' => array(
    'index' => 'Rest\Controller\IndexController',
    ...
),
'alias' => array(
    'index' => 'Admin\Controller\IndexController',
    ...
),
'alias' => array(
    'index' => 'Site\Controller\IndexController',
    ...
),
站点模块DI别名:

'alias' => array(
    'index' => 'Rest\Controller\IndexController',
    ...
),
'alias' => array(
    'index' => 'Admin\Controller\IndexController',
    ...
),
'alias' => array(
    'index' => 'Site\Controller\IndexController',
    ...
),
如您所见,某些控制器具有相同的名称(例如:
IndexController
),但由于zf2将配置与后进先出行为合并,因此,“索引”别名始终来自最后添加的模块

应用程序配置

'modules' => array('Rest','Admin', 'Site'),
当我访问时,我希望
index
别名提供
Admin\Controller\IndexController
,但由于站点模块(上次注册)具有与
index
相同的别名,它提供
Site\Controller\IndexController


如何使用不同的DI别名来匹配相同的控制器名称?

在将新的视图层合并到主视图之前,需要有别名才能使控制器在解析视图脚本时正常工作。现在这不再是必需的,甚至不再建议为控制器使用别名。别名的问题是一个FQCN有一个别名,因此您的问题与此直接相关


您需要做的是从DI配置中删除别名,并改用显式路由。“神奇”路线[:controller[/:action]]是一种不好的做法,它会导致更多的问题,而不是它所能帮助到的。因此,请编写一些明确的路由并删除别名。

您可以发布一些配置/DI吗?我会更新问题,向您展示每个模块和应用程序模块配置注册的DI别名配置。请参阅Akrabat网站上的配置:他为每个模块生成路由器,而不是别名。@Gabriel谢谢,我想在这里实现的是使用catchall路由,而不是为每个控制器添加单独的路由,但根据Matthew的说法,他们正在研究每个模块的
解决方案
,直到那时,最好的解决方案是为每个模块使用特定的路由器。感谢您的回复,不知何故,我更喜欢上面的方法,在当前应用程序中,zf1运行得非常好,这里我只想将其转换为zf2。每个模块都有许多控制器,我不想为每个模块编写一组路由配置。我认为,如果DI支持模块隔离配置,甚至是前缀,那将是一件好事aliasing@Komang我只是写下了推荐的内容和建议的方法。现在还没有一个“神奇”的路线,但是将会有一个涵盖您的用例的路线。您可以在路由名称中获得冲突,这不是最快的方法,但对于RAD进程来说可能很容易。您还可以使用分段管线,并为动作和其他参数使用可选线段,无需完全指定所有管线点。不过,对于控制器,如果您想让应用程序模块化,请不要使用别名。再次感谢,Matthew也建议使用相同的方法,因此在这种情况下,没有其他线索可以保留catchall路由:/controller“将有一个涵盖您的用例”~是否有建议?@Komang没有建议,但AgileZen董事会上有一个故事:。您可以在那里跟踪更改。如果您还没有agilezen.com帐户,也可以在上查看概述