2012-04-14 63 views
3

我有3个模块和路由CONFIGS像下面的应用程序相同的控制器名称:Zend框架2 DI别名,在不同的模块

  • admin.domain.tld/[:控制器[:/动作] = >管理
  • rest.domain.tld/[:控制器[:/ ID]] =>休息
  • 使用domain.tld/[:控制器[:/动作] =>网站

和集每个模块中所有控制器的DI别名

REST模块DI别名:

'alias' => array(
    'index' => 'Rest\Controller\IndexController', 
    ... 
), 

管理模块DI别名:

'alias' => array(
    'index' => 'Admin\Controller\IndexController', 
    ... 
), 

网站模块DI别名:

'alias' => array(
    'index' => 'Site\Controller\IndexController', 
    ... 
), 

正如你看到的,某些控制器具有相同的名称(例如, :IndexController),但是由于zf2将config与LIFO行为合并,所以始终从最后一个添加的模块中获取'index'别名。

应用程序配置

'modules' => array('Rest','Admin', 'Site'), 

当我访问http://admin.domain.tld/我希望index别名给Admin\Controller\IndexController但由于场地模块(最后注册)有index它给Site\Controller\IndexController

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

+0

你可以发布一些你的配置/ DI吗? – 2012-04-14 19:44:42

+0

我更新了问题,向您展示了每个模块和应用程序模块配置注册的DI别名配置。 – Komang 2012-04-15 06:08:24

+0

查看来自Akrabat网站的配置:http://akrabat.com/zend-framework-2/overriding-module-configuration-in-zf2/他为每个模块生成路由器,而不是别名。 – 2012-04-15 17:42:32

回答

3

在将新视图图层合并到主视图之前,需要在解析视图脚本时为控制器提供别名。现在不再需要这个了,甚至不推荐使用控制器的别名。混淆的问题是一个FQCN有一个别名,所以您的问题与此直接相关。

您需要做的是从DI配置中删除别名,并使用显式路由。 “魔术”路线[:控制器[/:动作]]是一个不好的习惯,会导致更多的问题,而不是它可以帮助你。因此,写一些明确的路线并删除别名。

+0

感谢您的回复,不知怎的,我更喜欢上面的方法,它在zf1当前的应用程序中运行得非常好,在这里我只是想将它转换为zf2。每个模块都有很多控制器,我不想为它们每个写一组路由配置。我认为如果DI支持模块隔离配置或甚至前缀别名 – Komang 2012-04-15 13:34:04

+0

@Komang我会记下什么是推荐和建议的方式。目前还没有一个“魔术”路线,但会有一个涵盖您的使用案例。您可以在路由名称中获得冲突,这不会是最快的方法,但RAD流程可能会很容易。您仍然可以使用带有可选分段的分段路线来执行操作和其他参数,您无需完全指定所有路线点。不过,对于控制器,如果你想保持你的应用程序模块化,请不要使用别名。 – 2012-04-15 14:14:30

+0

再次感谢,马修也提出了相同的方法,所以没有其他线索保持catchall路由:/控制器在这种情况下。 〜“会有一个涵盖你的用例的东西”〜是否有这样的提议? – Komang 2012-04-15 15:16:08