2012-04-14 59 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