2017-11-11 68 views
0

我在我的一個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 
], 

現在我的問題是,單詞數\控制器\ StartController被加載時,我請致電/module1/start。我認爲這是因爲第二個模塊的別名稍後定義並覆蓋第一個條目。是否有可能在此數組的默認部分中定義默認命名空間? 或者什麼是我的問題的正確解決方案?

更新: 我現在添加了兩個配置文件到phpfiddle。你可以在這裏找到他們: http://main.xfiddle.com/ac5762d7/module1.txt http://main.xfiddle.com/ac5762d7/module2.txt

我現在面臨的問題是「車庫」。

+0

您是否已經在module.config.php之上定義了名稱空間(例如,命名空間模塊1;)嘗試'控制器'=> \ Module1 \ Controller \ StartController :: class –

+0

是的,我做到了。我認爲問題不在代碼的這一部分,而是與別名或工廠。他們似乎是某種全球性的。 –

回答

0

我可能是錯的!但我想你可能會使用相同的路由名稱這兩個模塊。

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

一般ZF3加載在LIFO(後進先出)爲了這些路由。因此,匹配最經常的路線應註冊最後和最不常見的路線第一。

你可以試着改變模塊名稱,瞭解路線堆棧,當他們在你的config/modules.config.php

return [ 
    .... 

    'Module2', 
    'Module1', 
]; 

由於單詞數被合併的第一所以模塊1的路線應該先下班合併(在這種特殊情況下,例如),同時爲兩個模塊使用相同的路由名稱。訂購LifO

編輯:

不要使用用於創建服務名稱或別名相同的名稱。在這種情況下,最好使用完全合格的類名。嘗試使用別名的唯一名稱。與工廠試用控制器,如下:

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

ZF3需要時用於發電控制器提供了這種InvokableFactory::class。但是,如果任何控制器具有構造函數或在構造函數中使用參數,它就不適用。然後,您必須爲該類型的控制器創建工廠。

希望這會幫助你一點!

+0

謝謝。但可悲的是不。這兩條路線有不同的名稱(我的情況是「管理」和「基礎數據」)。我認爲改變模塊順序只會讓我反過來看到,在這兩種情況下總是會加載另一個控制器。 –

+0

它們是可調用的還是工廠驅動的控制?如果工廠驅動控制器,你確定工廠嗎?如果你能分享你的配置文件,我相信我們可以找到問題所在。 –

+0

更改模塊順序僅爲您提供ZF3的聚合和調用路線的意義,但如果您正在使用作曲者自動載入模塊,則無其他。但是,您應該檢查兩個模塊的命名空間。你會展示更多的代碼,包括腳本的命名空間嗎? – unclexo