Zend Framework 2的默认模块

And*_*708 3 php zend-framework2

在ZF1中,您不必在URL中包含该模块; 如果未提供,则默认为...默认模块.如何在ZF2中实现这一目标?我已经使用了骨架应用程序来启动和运行,但似乎我总是需要包含模块名称,例如/application/controller/action.

我想我可以通过创建一个包含两个"占位符"的路线来解决这个问题; 控制器和操作,然后将默认模块设置为"应用程序".然后我会将其放入/config/autoload/global.php(或者可能/config/application.config.php),以便路由适用于我的所有应用程序.但是,我收到错误消息,即URL无法通过路由匹配,即使我将路由硬编码为类似的东西/user/index.

我试过下面的代码.

return array(
    'router' => array(
        'routes' => array(
            'nomodule' => array(
                'type' => 'Zend\Mvc\Router\Http\Literal',
                'options' => array(
                    'route' => '/:controller/:action',
                    'constraints' => array(
                        'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                        'action' => '[a-zA-Z][a-zA-Z0-9_-]*'
                    ),
                    'defaults' => array(
                        'module' => 'Application' // Not sure of the syntax here
                    )
                )
            ),
        )
    )
);
Run Code Online (Sandbox Code Playgroud)

正如我写了一个评论,我不知道如果我的问题是默认的语法,但我不这么认为作为同样的情况,如果我硬编码的路径,并删除所有默认值.我还试图根据骨架应用程序中的示例进行实验,但没有运气.我是以错误的方式去做的吗?有更好的方法吗?或者我只是犯了一个错误?

提前致谢.

编辑:要使代码生效,请参阅答案.为了说明如何它的工作原理,请阅读这篇文章.

Xer*_*kus 11

注意:强烈建议使用显式路由而不是通配符.

您在尝试中使用了Zend\Mvc\Router\Http\Literal路由类型,因为您可能会猜测它是文字的,即完全匹配.要使其工作,您需要分段路由类型.

检查applicationZend Skeleton Application config中的路由及其子路由default.它完全符合您的要求.

至于模块 - 从代码的角度来看,没有'模块'这样的东西.模块在启动时注册资源,在此之后不再相关.在zf2中,您可以通过类或别名指定精确的控制器,在该控制器上向controllerManager注册

// module\Application\config\module.config.php
return array(
    'router' => array(
        'routes' => array(
            'home' => array(
                'type' => 'Zend\Mvc\Router\Http\Literal',
                'options' => array(
                    'route'    => '/',
                    'defaults' => array(
                        'controller' => 'Application\Controller\Index',
                        'action'     => 'index',
                    ),
                ),
                'may_terminate' => true,
                'child_routes' => array(
                    'default' => array(
                        'type' => 'Segment',
                        'options' => array(
                            'route' => '[:controller[/:action]]',
                            'constraints' => array(
                                'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                                'action' => '[a-zA-Z][a-zA-Z0-9_-]*'
                            ),
                            'defaults' => array(
                                'action' => 'index',
                                '__NAMESPACE__' => 'Application\Controller'
                            )
                        )
                    )
                )
            )
        )
    ),
    'controllers' => array(
        'invokables' => array(
            'Application\Controller\Index' => 'Application\Controller\IndexController',
            'Application\Controller\User' => 'Application\Controller\UserController'
        ),
    )
);
Run Code Online (Sandbox Code Playgroud)