2016-07-20 18 views
1

Ich bin in ZF3, mit dem Zend-MVC-Skelett und versuchen, eine generische Route zu konfigurieren, die so viele URLs wie möglich übereinstimmen wird, wie ich sein möchte in der Lage, neue Controller zu erstellen (natürlich auch Action-Methoden) und diese sofort verfügbar zu haben.ZF3 zend-mvc generische Route für viele Controller in einem Modul funktioniert nicht

Der in der Dokumentation beschriebene allgemeine Ansatz besteht darin, eine Route zu schreiben, die dem Controller und der Aktion entspricht (dasselbe gilt für ZF2).

Hier ist meine module.config.php

namespace Application; 

use Zend\Router\Http\Literal; 
use Zend\Router\Http\Segment; 
use Zend\ServiceManager\Factory\InvokableFactory; 

return [ 
    'router' => [ 
     'routes' => [ 
      'home' => [ 
       'type' => Literal::class, 
       'options' => [ 
        'route' => '/', 
        'defaults' => [ 
         'controller' => Controller\IndexController::class, 
         'action'  => 'index', 
        ], 
       ], 
      ], 
      'default' => [ 
       'type' => Segment::class, 
       'options' => [ 
        'route' => '/application[/:controller[/:action]]', 
        'defaults' => [ 
         'controller' => Controller\IndexController::class, 
         'action'  => 'index', 
        ], 
        'constraints' => [ 
         'controller' => '[a-zA-Z][a-zA-Z0-9_-]*', 
         'action'  => '[a-zA-Z][a-zA-Z0-9_-]*', 
        ], 
       ], 
      ], 
     ], 
    ], 
    'controllers' => [/* ... */], 
    'view_manager' => [/* ... */], 
], 

Es wirkt wie ein Zauber für http://localhost/ und http://localhost/application die indexAction() Funktion der IndexController Klasse innerhalb der /module/Application/src/IndexController.php Datei aufrufen.

Allerdings funktioniert es nicht, wenn ich versuche, die fooAction() Funktion in den gleichen Controller (d. H. IndexController) zu bekommen. Es löst nicht korrekt http://localhost/application/foo. und ich erhalte die folgenden Fehler:

A 404 error occurred 

Page not found. 

The requested controller could not be mapped to an existing controller class. 

Controller: 
foo (resolves to invalid controller class or alias: foo) 

No Exception available 

gleiche Fehler, wenn ich http://localhost/bar/foo versuchen, die fooAction() im barController zu bekommen.

Haben Sie eine Ahnung, was damit nicht stimmt? Jede Hilfe wird geschätzt. Danke vielmals.

Antwort

1

Die Route http://localhost/application/foo nicht an fooAction() im Index-Controller beheben, da /foo in der URL wird der Controller nicht die Aktion entsprechen. Mit dieser Routeneinstellung müssten Sie http://localhost/application/index/foo besuchen.

Um es zum Laufen zu bekommen, müssen Sie auch sicherstellen, dass Sie Ihren Controller in der Config, z. vorausgesetzt, Sie haben:

'controllers' => [ 
    'invokables' => [ 
     'Application\Controller\Index' => \Application\Controller\IndexController::class 
    ] 
], 

Dann alias der Steuerung, so dass es die Strecke Parameter übereinstimmt:

'controllers' => [ 
    'invokables' => [ 
     'Application\Controller\Index' => \Application\Controller\IndexController::class 
    ], 
    'aliases' => [ 
     'index' => 'Application\Controller\Index' 
    ] 
], 

Sie benötigen Aliase hinzuzufügen, die die Route Parameter für jeden Controller übereinstimmen, die nicht registriert ist mit die Zeichenfolge, die Sie für die Route möchten, z ein Controller Namespace\Controller\BarController sollte Aliasing zu bar, etc. sein.

+0

Entschuldigung für die Fehler in Tippfehler, ich sollte 'http: // localhost/application/index/foo' geschrieben haben, wie Sie es erwähnt haben. Der "Fehler" kam von den Aliasnamen, die fehlten. Es funktioniert jetzt. Danke. –

+0

Ich verwende diese Zend-Anwendung in einem anderen Verzeichnis. Also wurde ich versucht "http: // localhost/zend/skeleton-application/public/application/index/test". Aber immer noch 404. Kannst du mir sagen, wo ich verpasst habe? –

+0

Ich würde vermuten, dass es ein Problem mit der Serverkonfiguration gibt, vorausgesetzt, Sie verwenden eine der Dateien, die mit der Skeleton-Anwendung bereitgestellt werden. Es muss nach der Datei im öffentlichen Verzeichnis suchen und alles andere in index.php umschreiben; Ich denke, dass die Tatsache, dass Sie zf innerhalb eines Unterverzeichnisses des Dokumentenstamms haben, mit dem Routing in ZF3 unordentlich wird. Besser, dies als eine neue Frage zu posten. – avy

0

Ich kam hier mit ähnlichen Problem. Ich habe zwei Controller in "Application" -Modul und zwei neue Modul "Account" mit dem gleichen Namen erstellt.

Application/Controller/IndexController 
Application/Controller/OverviewController 
Account/Controller/IndexController 
Account/Controller/OverviewController 

hier sind meine modules.config.php

module/Account/config/module.config.php

return [ 
'router' => [ 
    'routes' => [ 
     'Account-account' => [ 
     'type' => Segment::class, 
     'options' => [ 
      'route' => '/account[/][:controller[/][:action][/]]', 
      'defaults' => [ 
      '__NAMESPACE__' => 'Account\Controller', 
      'controller' => Account\Controller\IndexController::class, 
      'action'  => 'index', 
      'locale' => 'en_us' 
      ], 
     ], 
     'may_terminate' => true, 
     'child_routes' => [ 
      'wildcard' => [ 
      'type' => 'Wildcard' 
      ], 
     ], 
     ], 
    ], 
], 
'controllers' => [ 
    'factories' => [ 
     Controller\IndexController::class  => AccountControllerFactory::class, 
     Controller\OverviewController::class => AccountControllerFactory::class, 
    ], 
    'aliases' => [ 
     'index' => IndexController::class, 
     'overview' => OverviewController::class 
    ] 

], 

und mein Modul/Application/config/module.config.php

return [ 
    'router' => [ 
     'routes' => [ 
      'home' => [ 
       'type' => Literal::class, 
       'options' => [ 
        'route' => '/', 
        'defaults' => [ 
         'controller' => Controller\IndexController::class, 
         'action'  => 'index', 
        ], 
       ], 
      ], 
      'Application-application' => [ 
      'type' => Segment::class, 
      'options' => [ 
       'route' => '/application[/][:controller[/][:action][/]]', 
       'defaults' => [ 
       '__NAMESPACE__' => 'Application\Controller', 
       'controller' => Application\Controller\IndexController::class, 
       'action'  => 'index', 
       'locale' => 'en_US' 
       ], 
      ], 
      'may_terminate' => true, 
      'child_routes' => [ 
       'wildcard' => [ 
       'type' => 'Wildcard' 
       ], 
      ], 
      ], 
     ], 
    ], 
    'controllers' => [ 
     'factories' => [ 
      Controller\IndexController::class => IndexControllerFactory::class, 
      Controller\OverviewController::class => IndexControllerFactory::class, 
     ], 
     'aliases' => [ 
      'index'  => IndexController::class, 
     'overview' => OverviewController::class, 
     ] 

    ], 

Mit dieser Konfiguration, wenn Aliase Abschnitte sind kommentiert es gibt eine Fehlermeldung, die besagt, dass es einen ungültigen Controller oder Alias ​​(Index/Übersicht) gibt. Wenn Aliase sind Route: "Anwendung/Übersicht/Index" geht in Account-Modul.