我使用的是 CakePHP 2.7,并且在 app/Config/routes.php
中定义了以下路由:
Router::connect('/:state/:location/:slug',
['controller' => 'pages', 'action' => 'display_program'],
['pass'=> ['state', 'location', 'slug']]
);
Router::connect('/:state/:location/:degree_level/:slug',
['controller' => 'pages', 'action' => 'display_program'],
['pass'=> ['state', 'location', 'degree_level', 'slug']]
);
Router::connect('/:state/:location/:degree_level',
['controller' => 'pages', 'action' => 'list_programs'],
['pass'=> ['state', 'location', 'degree_level']]
);
我遇到的问题是当我传递三个值时,第三个值可以是度数级别或slug。
/az/campus/program-name-slug [should route to pages->display_program()]
/az/campus/masters/program-name-slug [should route to pages->display_program()]
/az/campus/masters [should route to pages->list_programs()]
现在,所有三个 url 都路由到 display_program() 操作,但是我需要第三个 URL(不带 slug)路由到 list_program()。非常感谢任何想法!
最佳答案
因此,如果您的学位级别从不与程序名称冲突,那么您可以使用简单的正则表达式来进一步缩小 level_level
元素匹配的范围,例如
Router::connect('/:state/:location/:degree_level',
['controller' => 'pages', 'action' => 'list_programs'],
[
'pass'=> ['state', 'location', 'degree_level'],
'degree_level' => 'undergraduate|graduate|bridge|doctorate'
]
);
这样,level_level
元素仅在使用四个给定字符串之一的情况下才会匹配。
为了使其最终起作用,您必须将此路由放在带有 slug
元素的路由之前,否则 slug 会窃取该路由,因为它会贪婪地匹配任何字符串,即最后你应该将路由排序为
// specific count match, semi-specific value match
Router::connect('/:state/:location/:degree_level',
// ...
);
// specific count match, greedy value match
Router::connect('/:state/:location/:slug',
// ...
);
// sepcific count match, greedy value match
Router::connect('/:state/:location/:degree_level/:slug',
// ...
);
关于cakephp - 在 CakePHP 中设置条件路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31196575/