2016-05-02 4 views
1

Ist es im ZF2-Routing möglich, eine generische Elternroute zu haben, die allen öffentlichen Aktionen entspricht, aber bestimmte Bereiche mit einer benutzerdefinierten untergeordneten Route und Controller überschreibt?ZF2 verwendet untergeordnete Route, wenn Kind und Eltern übereinstimmen

Was ich will:

/parent => matches parent controller 
/parent/edit => matches parent controller editAction 
/parent/childsection => matches child controller 
/parent/childsection/edit => matches child controller editAction 

Ich konnte nicht mit jeder Konfiguration kommen, die meinen Bedürfnissen entspricht. Nach der Konfiguration würde ich denken, würde funktionieren - aber ZF2 Routen endet auf der übergeordneten Route Ursache childsection könnte auch eine Aktion sein.

'parent' => array(
    'type' => 'Segment', 
    'may_terminate' => true, 
    'options' => array(
     'route' => '/parent[[/:action][/:id]]', 
     'constraints' => array(
      'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 
      'id' => '[0-9]+', 
     ), 
     'defaults' => array(
      'controller' => 'Application\Controller\Parent', 
      'action' => 'index', 
     ), 
    ), 
    'child_routes' => array(
     'child' => array(
      'type' => 'Segment', 
      'options' => array(
       'route' => '/childsection/:action[/:id]', 
       'constraints' => array(
        'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 
        'id' => '[0-9]+', 
       ), 
       'defaults' => array(
        'controller' => 'Application\Controller\Child', 
       ), 
      ), 
     ), 
    ), 
), 

Das einzige, was arbeitete, war eine minimal Eltern wörtliche Route und 2 Kind Routen - 1 generic und 1 spezifisch für das Kind Abschnitt. Aber in diesem Fall muss ich URLs umleiten oder generieren mit ->toRoute('parent/default'...)

Gibt es eine andere elegante Lösung oder ist das einfach nicht möglich?

Antwort

0

Ich sage immer, dass sie nicht solche Regex für Controller/Aktion verwenden sollten. Versuchen Sie stattdessen, etwas eingeschränkteres wie (bearbeiten | löschen) zu verwenden und weiterhin weißliche Aktionen zur Liste hinzuzufügen.

+0

Könnten Sie erklären, warum genau Sie Leute sagen, dies zu tun? Ich mag diese Ausdrücke, weil es mir viel Schreibarbeit erspart, wenn ich neue Aktionen hinzufügen möchte. Und wenn ich eine öffentliche Methode hinzufüge, die mit "... Action" endet, möchte ich, dass sie automatisch zugreifbar ist, ohne sich in die Konfiguration einarbeiten zu müssen. Aber danke für den Kommentar, könnte dies eine Alternative zu meinem derzeitigen Ansatz sein. –

0

konnte man immer etwas tun, wie

route => /foo[/:bar[/:baz[/:bing]]] 

wo bar, baz, bing würde Aktion, sein Kind-Controller und Kind-Aktion und definieren sie mit Einschränkungen wie du gerade getan hast. Ich würde dann diese Route zu einer SupervisorController mit superviseAction zuordnen.

Diese Aktion würde dann prüfen, ob ein Controller vorhanden ist, der dem angegebenen Routinenamen entspricht, und ob dieser Controller dann die angegebene Aktion hat. Dann könnten Sie den Controller holen und einfach die Aktion aufrufen.

Aber wie @ Grizzm0 sagte, das ist unrein. Es ist sehr anfällig für Fehler und irgendwann wissen Sie vielleicht nicht einmal, was wo gesendet wird. Meine persönliche Präferenz (und die der meisten Leute in meinem Umfeld, soweit ich ihren Stil kenne) wäre, sich einfach die Zeit zu nehmen und alle Routen von Hand zu konfigurieren.

Es ist ein bisschen Arbeit, ja, aber Sie wissen immer, was vor sich geht. Manchmal ist weniger Magie mehr!

+0

Nun, ich möchte nicht alles durch einen anderen Controller leiten, da dies, wie Sie selbst sagten, fehleranfällig und praktisch intransparent ist. Und die URLs werden mit 3 zusätzlichen Segmenten statt 1 größer. In diesem Fall mag ich meine aktuelle Implementierung (1 untergeordnete Route für den Kind-Controller und 1 untergeordnete Route für alle anderen übergeordneten Aktionen) mehr. Aber ich denke, ich werde den Vorschlag von Grizzm0 versuchen –

Verwandte Themen