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)