Zend Framework 2 Standard-Modul
In ZF1 Sie nicht haben, um zu beinhalten, die dem Modul in der URL; sofern Sie Sie nicht, es wäre Standard... das Standard-Modul. Wie kann dies erreicht werden in ZF2? Ich habe die skeleton-Anwendung zum laufen zu bringen, aber es scheint so, als wenn ich immer brauchen, um den Namen des Moduls, z.B. /application/controller/action
.
Dachte ich, ich könnte dies umgehen, indem erstellen einer route mit zwei "Platzhalter"; controller und die Aktion, und legen Sie dann das Standard-Modul "Anwendung". Ich würde dann packen Sie diese in /config/autoload/global.php
(oder vielleicht /config/application.config.php
), so dass die route gilt für alle auf meiner Anwendung. Allerdings bin ich immer die Fehlermeldung, dass die URL konnte nicht zugeordnet werden, indem das routing, auch wenn ich hart code, den Weg zu so etwas wie /user/index
.
Habe ich versucht, den code weiter unten.
return array(
'router' => array(
'routes' => array(
'nomodule' => array(
'type' => 'Zend\Mvc\Router\Http\Literal',
'options' => array(
'route' => '/:controller/:action',
'constraints' => array(
'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
'action' => '[a-zA-Z][a-zA-Z0-9_-]*'
),
'defaults' => array(
'module' => 'Application' //Not sure of the syntax here
)
)
),
)
)
);
Als ich schrieb als Kommentar, ich bin nicht sicher, ob mein problem mit den defaults der syntax, aber ich würde nicht denken, dass damit das gleiche passiert, wenn ich codieren Sie die route und entfernen Sie alle Standardeinstellungen. Ich habe auch versucht, damit zu Experimentieren, basierend auf den Beispielen in der skeleton-Anwendung, aber ohne Glück. Werde ich über es der falsche Weg ist? Gibt es einen besseren Ansatz? Oder habe ich gerade einen Fehler???
Vielen Dank im Voraus.
Edit: Für den code, damit es funktioniert, finden Sie die Antwort. Für eine Erklärung der wie es funktioniert, Lesen Sie dieser Artikel.
InformationsquelleAutor Andy0708 | 2012-09-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hinweis: Explizite Routen wird dringend empfohlen, über die wildcard.
Du verwendet Zend\Mvc\Router\Http\Literal die Art der route in Ihren versuchen, wie Sie vielleicht erraten, es ist die wörtliche, dh genaue übereinstimmung. Damit es funktioniert, müssen Sie segment der route geben.
Überprüfen Sie
application
- route im Zend-Skeleton-Application-config und es ist Kind-routedefault
.Es tut genau, was Sie zu tun versuchen.
Als für Module - es gibt keine solche Sache als 'Modul' aus code Perspektive. Modul-Register Ressourcen auf Start und es ist nicht mehr relevant, nach diesem Punkt.
In zf2 geben Sie die exakte Steuerung, die durch die Klasse oder alias-name, unter dem controller registriert mit controllerManager
es ist nicht erforderlich, um in
invokables
es kann konfiguriert werden, wie die Fabrik zu. Aber ja, es muss im ControllerManager.natürlich, aber da Sie verwendet invokables ich dachte, es würde mehr Sinn machen, darauf hinzuweisen, dass als zusätzliche Informationen Hinzugefügt, das ist Ihre Aufgabe 🙂
Danke für die Antwort. Musste ich machen kleine Anpassungen für den code zu arbeiten, aber Sie wies mich in die richtige Richtung. Ich habe bearbeitet Sie den code in Ihrer Antwort unbedingt meine Bearbeitungen. Ich entfernt einen Schrägstrich aus den Branchen-route (da ist es ein Kind der route der
/
route) und die__NAMESPACE__
zu meinem controller Verzeichnis. Dadurch kann ich schreibenlocalhost/user
in der URL und es anzeigen zuApplication\Controller\User
anstatt meine controller-Tasten, mit denen in der URL (und damit der öffnung für Modul controller-Kollisionen).Ich hatte erwartet, dieser code funktioniert mit folgenden URLs: /application/index/index /application/index (Aktion ist default); /Anwendung (controller und action sind default); /index/index (Modul ist Standard) /index (Modul-und action sind Standard); Aber es funktioniert nicht... Also meiner Meinung nach ist es nicht die richtige Antwort... natürlich verstehe ich, dass es keine solche Sache als Modul, aber lassen Sie uns sagen, Sie existieren im Weg.
InformationsquelleAutor Xerkus
Wie ich bereits im Kommentar unter @Xerkus Antwort, es funktioniert nicht für alle URLs:
Habe ich auch
testAction()
zuIndexController
undTestController
mit gleichen Aktionen wieIndexController
, so konnte ich testen, meine Lösung auf folgenden Strecken:Also nach einigen Forschung (hier und hier hauptsächlich) bereitete ich eine Lösung für alle von Ihnen. Ich füge meine ganze
module.config.php
array:Im Vergleich mit Zend 2 Skeleteon Application-config, die ich Hinzugefügt habe
noModule
route, und neuencontroller invokable
-test
. NatürlichnoModule
route umfasstApplication/Controller
Namensraum, so dass basierend auf dieser Tatsache, können Sie einstellen, welche Standard-module, die Sie benötigen. Jetzt funktioniert es wie es sollte.Natürlich daran erinnern, dass Ihr
noModule
route definiert werden sollte, in das erste Modul vonapplication.config.php
um sicherzustellen, dass es stets Vorrang. Denken Sie auch daran, die Standard-Modul-Lösung sollte sorgfältig durchgeführt werden, um Konflikte zu vermeiden zwischen Controller und Module Namen, wenn Sie z.B. die Namen Ihrer nächsten ModulIndex
, dann ist klar, Sie haben Konflikte mitIndexController
imApplication
Modul.Ich Stimme Ihnen zu, dass es nicht so wie es sein soll, und es mischen zf1 Ansatz mit zf2 Architektur. Das ist, warum ich geschrieben haben, Sie werden müssen vorsichtig und für Konflikte suchen. Ich habe nicht gesagt, ich werde es in jedem Projekt - ich habe einfach die Frage gestellt. Manchmal können Sie nicht Folgen Sie der bestmögliche Ansatz oder design-Muster, und ich weiß, dass Sie als Entwickler konfrontiert sind solche Situationen sowohl vor als auch. Das ist, warum ich einige Zeit damit verbracht, damit dieser code funktioniert. Und wie ich schon schrieb, ich Stimme mit Ihrer theoretischen Erklärung, die wirklich half mir zu verstehen, einige Dinge in ZF2 routing.
InformationsquelleAutor Karol
Ich bin neu bei ZF im Allgemeinen und ich habe gerade angefangen zu lernen, so versuchte dies und es funktionierte für mich. Nur um sicher zu sein, u wollen, ändern Sie Ihre Standard-Modul, wenn Sie gehen, um Ihre domain-URL und nicht geben in einem controller-name, richtig?
Gehen Sie zu Ihrem module.config.php
Danke für den Tipp 🙂
InformationsquelleAutor Lorenz V.