Проблема маршрутизации имени модуля Zend Framework 2

У меня проблема с маршрутизацией модуля. У меня есть 2 модуля, приложение и админ. Каждый модуль имеет indexAction как действие по умолчанию:

localhost/- > Приложение/индекс

localhost/admin/- > Admin/index

Администратор/индекс работает только с localhost/admin/index/

Эта проблема возникает, когда имя модуля начинается с буквы "A". Если я переименую Admin в "Cars", localhost/cars/работает правильно!

ошибка:

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

Это module.config.php внутри модуля приложения:

<?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',
        ),
    ),
);
?>

это module.config.php внутри модуля администратора:

    <?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()
    {}
}

Кто-нибудь может мне помочь?

Ответ 1

Сначала ваша ошибка The requested controller was unable to dispatch the request. происходит только тогда, когда маршрутизатор не может отправить запрос на свое определенное действие. Поэтому убедитесь, что ваш контроллер правильно, и действия присутствуют и могут быть вызваны.

Как уже указывалось, маршрут /admin/ указывает на две настроенные конечные точки. Это не проблема в первую очередь, когда маршрут администратора будет определен до маршрута приложения в конфигурации.

Таким образом, маршрут маршрута /admin/ никогда не будет перенаправлен на ваш AdminController, поскольку первый динамический маршрут будет сопоставлен первым.

Чтобы получить ожидаемый результат, используйте параметр priority в своем маршруте, чтобы убедиться, что ваш маршрут Admin будет сопоставлен до вашего маршрута 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'
                 ),
             ),
         ),
     ),
 ),

Помимо вашего вопроса, не завершайте скрипты php с помощью ?>, так как это может привести к ошибкам, когда пробел после концевого тега.