我有两个关于用户友好 URL 的问题。
我有一个路由器设置如下:
- 实际的 URL 是
http://www.example.com/course/view-batch/course_id/19
- 我想要一个更友好的 URL
http://www.example.com/java-training/19
我在 application.ini
中设置了以下路由:
resources.router.routes.viewbatchcourse.route = "/:title/:course_id/"
resources.router.routes.viewbatchcourse.defaults.controller = course
resources.router.routes.viewbatchcourse.defaults.action = view-batch
resources.router.routes.viewbatchcourse.reqs.course_id = "\d+"
这非常有效。
现在我有一个新页面 - 其中包含 Java 的用户评论
- 实际的 URL 是
http://www.example.com/course/view-reviews/course_id/19
- 我想要一个更友好的 URL
http://www.example.com/java-reviews/19
我意识到这是不可能的,因为已经设置了一个路由来匹配该格式。
所以我在想是否可以使用正则表达式并检查标题是否包含“评论”然后使用此路由。
我试过这种方法,但它不起作用。相反,它会打开查看批处理页面:
resources.router.routes.viewreviews.type = "Zend_Controller_Router_Route_Regex"
resources.router.routes.viewreviews.route = "/:title/:course_id"
resources.router.routes.viewreviews.defaults.controller = "course"
resources.router.routes.viewreviews.defaults.action = "view-reviews"
resources.router.routes.viewreviews.reqs.course_id = "\d+"
resources.router.routes.viewreviews.reqs.title = "\breviews\b"
我最接近这个工作的是
resources.router.routes.viewreviews.route = "/:title/:course_id"
resources.router.routes.viewreviews.defaults.controller = "course"
resources.router.routes.viewreviews.defaults.action = "view-reviews"
resources.router.routes.viewreviews.reqs.course_id = "\d+"
resources.router.routes.viewreviews.reqs.title = "reviews"
现在,如果我输入 URL http://www.example.com/reviews/19
,则会调用 view-reviews 操作。
是否有可能 - 检查标题是否包含“评论”一词 - 然后应该调用此路由?
回到我之前的 http://www.example.com/java-training/19
工作路线:
resources.router.routes.viewbatchcourse.route = "/:title/:course_id/"
resources.router.routes.viewbatchcourse.defaults.controller = course
resources.router.routes.viewbatchcourse.defaults.action = view-batch
resources.router.routes.viewbatchcourse.reqs.course_id = "\d+"
数字 19
是类(class) ID,我在从数据库中提取详细信息的操作中需要它。
但是当页面显示时,我不希望数字 19 可见。
我只希望 URL 为 http://www.example.com/java-training
这可能吗?
最佳答案
1) 你可以使用Route_Regex
来实现你想要的
protected function _initRoutes()
{
$router = Zend_Controller_Front::getInstance()->getRouter();
$route = new Zend_Controller_Router_Route_Regex(
'([a-zA-Z]+)-reviews/(\d+)',
array(
'module' => 'default',
'controller' => 'course',
'action' => 'view-reviews'
),
array(
1 => 'language',
2 => 'course_id',
)
);
$router->addRoute('review', $route);
$route = new Zend_Controller_Router_Route_Regex(
'([a-zA-Z]+)-training/(\d+)',
array(
'module' => 'default',
'controller' => 'course',
'action' => 'view-batch'
),
array(
1 => 'language',
2 => 'course_id',
)
);
$router->addRoute('training', $route);
}
2) 对于第二点,我看不出这是怎么可能的。
不过,您可以做的一件事是使用类(class)名称(如果有的话)来显示如下网址:
www.xyz.com/java-training/my-awesome-course-19
www.xyz.com/java-training/19/my-awesome-course
使用我上面提到的路线会很容易。
关于php - Zend Framework - 使用路由和正则表达式设置用户友好的 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30345079/