2012-04-14 1 views
3

Ich habe eine Anwendung mit 3 Modulen und Strecke configs wie unten:Zend Framework 2 DI alias, gleiche Controller-Namen in verschiedenen Modulen

  • admin.domain.tld/[: controller [:/action]] = > Admin
  • rest.domain.tld/[: controller [:/id]] => Rest
  • domain.tld/[: controller [:/action]] => Site

und Set DI Alias ​​für alle Controller in jedem Modul

REST-Modul DI Alias:

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

Admin-Modul DI Alias:

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

Site-Modul DI Alias:

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

Wie Sie sehen, einige Controller hat denselben Namen (zB : IndexController), aber seit zf2 Config mit LIFO-Verhalten zusammengeführt, 'Index' Alias ​​immer aus dem zuletzt hinzugefügten Modul.

Anwendung Config

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

wenn ich http://admin.domain.tld/ Zugriff erwarte ich index alias gibt Admin\Controller\IndexController aber da Site-Module (zuletzt registriert) hat gleiche Alias ​​für index es Site\Controller\IndexController

gibt Wie anders DI Alias ​​verwenden, um Gleicher Controller-Name?

+0

Können Sie einige Ihrer configs/DI veröffentlichen? –

+0

Ich aktualisiere die Frage, um Ihnen DI-Aliaskonfigurationen für jede Modul- und Anwendungsmodulkonfigurationsregistrierung zu zeigen. – Komang

+0

Siehe die Konfigurationen von Akrabat: http://akrabat.com/zend-framework-2/overriding-module-configuration-in-zf2/ Er generiert Router für jedes Modul, nicht Alias. –

Antwort

3

Bevor der neue Ansichtslayer mit dem Master zusammengeführt wurde, mussten Aliasnamen für Controller erforderlich sein, damit sie beim Auflösen von Ansichtsskripts korrekt reagierten. Nun ist dies nicht mehr erforderlich, es wird sogar nicht mehr empfohlen, Aliase für Controller zu verwenden. Das Problem mit Aliasing ist, dass es einen Alias ​​für einen FQCN gibt, also hängt Ihr Problem direkt damit zusammen.

Sie müssen Aliase aus der DI-Konfiguration entfernen und stattdessen explizite Routen verwenden. Die "magische" Route [: controller [/: action]] ist eine schlechte Übung und führt zu mehr Problemen, als sie Ihnen helfen können. Schreiben Sie also einige explizite Routen und entfernen Sie die Aliase.

+0

danke für deine Antwort, irgendwie gefällt mir mehr der Ansatz oben, der innerhalb der aktuellen App mit zf1 recht gut läuft, hier möchte ich ihn einfach in zf2 umwandeln. Jedes Modul hat viele Controller und ich möchte nicht jede Menge Routing-Konfigurationen für jedes Modul schreiben.Ich denke, wäre gut, wenn DI-Modul isolierte Konfiguration oder sogar Präfix-Aliasing – Komang

+0

@Komang Ich habe nur aufgeschrieben, was empfohlen und der vorgeschlagene Weg ist. Es gibt noch keine "magische" Route, aber es wird eine geben, die Ihren Anwendungsfall abdeckt. Sie können Kollisionen in Routennamen bekommen, und dies wird nicht die schnellste Methode sein, aber es könnte für RAD-Prozesse einfach sein. Sie können auch segmentierte Routen mit optionalen Segmenten für Aktionen und andere Parameter verwenden. Sie müssen nicht alle Routenpunkte vollständig angeben. Verwenden Sie für Controller jedoch keine Aliase, wenn Sie Ihre Apps modular halten möchten. –

+0

nochmals danke, Matthew schlägt auch den gleichen Ansatz, also kein anderer Hinweis, um Catchall Routing:/Controller in diesem Fall zu halten. ~ "Es wird einen geben, der Ihren Anwendungsfall abdeckt" ~ Gibt es einen Vorschlag dafür? – Komang