我实际上在我的ZF2应用程序中有2个模块(应用程序和管理员),我想要像ZF1中那样的URL路由。我目前有以下路线:
'router' => array
(
'routes' => array
(
'admin' => array
(
'type' => 'Segment',
'options' => array
(
'route' => 'admin/[:controller[/:action]]',
'constraints' => array
(
'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
),
'defaults' => array
(
'__NAMESPACE__' => 'Admin\Controller',
'controller' => 'Index',
'action' => 'index',
),
),
'may_terminate' => true,
'child_routes' => array
(
'wildcard' => array
(
'type' => 'Wildcard'
)
)
),
),
),
所以它会匹配“/ admin”,“/ admin / controller”,“/ admin / controller / action”而不是“/ controller / action”。
现在我需要一个到Application模块的路由。问题是如果我只是为模块应用程序使用这样的路由,这条新路由将匹配“/ admin / controller”作为controller =“admin”和action =“controller”。
我还在应用程序中尝试了以下正则表达式路径:
'application' => array
(
'type' => 'Regex',
'options' => array
(
'regex' => '/(?<controller>^(?!(admin)$)[a-zA-Z][a-zA-Z0-9_-]*)?' .
'(/[a-zA-Z][a-zA-Z0-9_-]*)?',
'spec' => '/%controller%/%action%',
/*'constraints' => array
(
//The controller cannot be "admin"
'controller' => '^(?!(admin)$)[a-zA-Z][a-zA-Z0-9_-]*',
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
),*/
'defaults' => array
(
'__NAMESPACE__' => 'Application\Controller',
'controller' => 'Index',
'action' => 'index',
),
),
'may_terminate' => true,
'child_routes' => array
(
'wildcard' => array
(
'type' => 'Wildcard'
)
)
),
但它没有得到变量“控制器”和“动作”。
有没有人建议如何解决这个问题?
答案 0 :(得分:0)
介意路由顺序:使用LIFO堆栈处理路由,因此匹配请求URL时,数据中的最后一个是最后的。
这意味着您必须首先定义最通用的路线,以防止它们匹配相似但更具体的路线。
使用以下顺序不应该对controller
参数有任何约束,因为以/admin
开头的任何内容都将首先匹配
'route1' => array(
'type' => 'Segment',
'options' => array(
'route' => '/[:controller[/:action]]',
'defaults' => array (
'controller' => 'controller',
'action' => 'index',
),
),
),
'route2' => array(
'type' => 'Segment',
'options' => array(
'route' => '/admin[/:controller[/:action]]',
'defaults' => array (
'controller' => 'admin-controller',
'action' => 'index',
),
),
),
此外,您始终可以使用priority
属性(不应在options
数组下定义,但在路由的最顶层数组中)指定excplicitly路由优先级,因此以下代码为相当于前面的例子:
'route2' => array(
'type' => 'Segment',
'options' => array(
'route' => '/admin[/:controller[/:action]]',
'defaults' => array (
'controller' => 'admin-controller',
'action' => 'index',
),
),
),
'route1' => array(
'type' => 'Segment',
'options' => array(
'route' => '/[:controller[/:action]]',
'defaults' => array (
'controller' => 'controller',
'action' => 'index',
),
),
'priority' => -1,
),