Zend framework 2 模块名称路由问题

Zend framework 2 module name routing issue

我的模块路由有问题。我有 2 个模块,应用程序和管理。每个模块都有 indexAction 作为默认操作:

localhost/ --> Application/index

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. 仅在路由器无法将请求分派到其定义的操作时才会发生。因此,请验证您的控制器是否正确以及操作是否存在且可调用。

正如已经指出的那样,您的 /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 脚本,因为当结束标记后有空格时,这可能会导致错误。