2015-11-16 21 views
10

Mam problem z routingiem modułów. Mam 2 moduły, aplikację i administratora. Każdy moduły mają indexAction jako domyślnej akcji:Zend framework 2 nazwa modułu routingu numer

localhost/-> Application/index

localhost/admin/-> Admin/index

Admin/index działa tylko z localhost/admin/index/

Ten problem występuje, gdy nazwa modułu zaczyna się od litery "A". Jeśli zmienię Admin na "Cars", localhost/cars/działa poprawnie!

błąd jest:

A 404 error occurred 
The requested controller was unable to dispatch the request. 
Controller: 
Application\Controller\Application 
No Exception available 

To module.config.php wewnątrz modułu aplikacji:

<?php 
return array(
    'router' => array(
     'routes' => array(
      'Application' => array(
       'type' => 'Segment', 
       'options' => array(
        'route' => '[/][:action/]', 
        'constraints' => array(
         'action' => '[a-zA-Z][a-zA-Z0-9_-]*',       
        ), 
        'defaults' => array(
         'controller' => 'Application\Controller\Application', 
         'action'  => 'index', 
        ), 
       ), 
      ), 
     ), 
    ), 
    'controllers' => array(
     'invokables' => array(
      'Application\Controller\Application' => 'Application\Controller\IndexController' 
     ), 
    ), 

    'view_manager' => array(
     'display_not_found_reason' => true, 
     'display_exceptions'  => true, 
     'not_found_template'  => 'error/404', 
     'exception_template'  => 'error/index', 
     'template_map' => array(
      'layout/layout'   => __DIR__ . '/../view/layout/layout.phtml', 
      'Application/Application/index' => __DIR__ . '/../view/Application/index/index.phtml', 
      'error/404'    => __DIR__ . '/../view/error/404.phtml', 
      'error/index'    => __DIR__ . '/../view/error/index.phtml', 
     ), 
     'template_path_stack' => array(
      'Application' => __DIR__ . '/../view', 
     ), 
    ), 
); 
?> 

to module.config.php wewnątrz modułu Admin:

<?php 
return array(
    'router' => array(
     'routes' => array(
      'Admin' => array(
       'type' => 'Segment', 
       'options' => array(
        'route' => '/admin/[:action/]', 
        'constraints' => array(
         'action' => '[a-zA-Z][a-zA-Z0-9_-]*' 
        ), 
        'defaults' => array(
         'controller' => 'Admin\Controller\AdminController', 
         'action' => 'index' 
        ), 
       ), 
      ), 
     ), 
    ), 
    'controllers' => array(
     'invokables' => array(
      'Admin\Controller\AdminController' => 'Admin\Controller\AdminController' 
     ), 
    ), 
    'view_manager' => array(
     'display_not_found_reason' => true, 
     'display_exceptions'  => true, 
     'template_path_stack'  => array(
      'Admin' => __DIR__ . '/../view', 
     ), 
    ), 
); 
?> 

IndexController.php

namespace Application\Controller; 

use Zend\Mvc\Controller\AbstractActionController; 
use Zend\View\Model\ViewModel; 

class IndexController extends AbstractActionController 
{ 

    public function indexAction(){ 

    } 
} 

AdminController.php

namespace Admin\Controller; 

use Zend\Mvc\Controller\AbstractActionController; 
use Zend\View\Model\ViewModel; 

class AdminController extends AbstractActionController 
{ 

    public function indexAction() 
    {} 
} 

Ktoś może mi pomóc?

+0

Jakie komunikaty o błędach napotykasz? –

+1

Żądanie '/ admin /' pasuje do twoich tras aplikacji i administratora. Aby rozwiązać problem, musisz usunąć tę niejednoznaczność. –

+0

Wystąpił błąd 404 Żądany kontroler nie mógł wysłać żądania. Kontroler: Aplikacja \ Kontroler \ Aplikacja Brak wyjątku –

Odpowiedz

3

Najpierw twój błąd The requested controller was unable to dispatch the request. pojawia się tylko wtedy, gdy router nie może wysłać żądania do zdefiniowanej akcji. Dlatego sprawdź, czy Twój kontroler jest poprawny, a akcje są obecne i można je wywoływać.

Jak już wspomniano, twoja trasa /admin/ wskaże dwa skonfigurowane punkty końcowe. Nie stanowi to problemu w pierwszej kolejności, gdy ścieżka administratora zostanie zdefiniowana przed trasą aplikacji w konfiguracji.

Twoja trasa nigdy nie zostanie przekierowana na numer AdminController, ponieważ pierwsza trasa dynamiczna zostanie dopasowana.

Aby uzyskać oczekiwany wynik, użyj ustawienia priority na trasie, aby upewnić się, że Twoja trasa Admin zostanie dopasowana przed trasą Application.

'router' => array(
    'routes' => array(
     'Admin' => array(
      'priority' => 100, 
      'type' => 'Segment', 
      'options' => array(
       'route' => '/admin/[:action/]', 
       'constraints' => array(
        'action' => '[a-zA-Z][a-zA-Z0-9_-]*' 
       ), 
       'defaults' => array(
        'controller' => 'Admin\Controller\AdminController', 
        'action' => 'index' 
       ), 
      ), 
     ), 
    ), 
), 

Obok swoje pytanie, nie kończą skrypty php z ?> jak mogłoby to prowadzić do błędów, gdy spacje po tagu końcowego.

+0

działa! bardzo dziękuję za pomoc! –