У меня проблема с маршрутизацией модуля. У меня есть 2 модуля, приложение и админ. Каждый модуль имеет indexAction как действие по умолчанию:
localhost / -> Приложение / индекс
localhost / admin / -> Admin / index
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() {} }
Кто-нибудь может мне помочь?
Сначала ваша ошибка The requested controller was unable to dispatch the request.
происходит только тогда, когда маршрутизатор не может отправить запрос на свое определенное действие. Поэтому убедитесь, что ваш контроллер правильно, и действия присутствуют и могут быть вызваны.
Поскольку allready указал, что ваш /admin/
route будет указывать на две настроенные конечные точки. Это не проблема в первую очередь, когда маршрут администратора будет определен до маршрута приложения в конфигурации.
Таким образом, ваш маршрут /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 с помощью ?>
Поскольку это может привести к ошибкам, когда пробелы после концевого тега.