Zend Framework - 使用路由和正则表达式设置用户友好的URL

Gub*_*ooo 10 php zend-framework routes zend-route

我有两个用户友好的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+"
Run Code Online (Sandbox Code Playgroud)

这非常有效.

现在我有一个新页面 - 其中包含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"
Run Code Online (Sandbox Code Playgroud)

我最接近它的工作是

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"
Run Code Online (Sandbox Code Playgroud)

现在,如果我输入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+"
Run Code Online (Sandbox Code Playgroud)

该数字19是课程ID,我需要在操作中从数据库中提取详细信息.

但是当页面显示时,我不希望数字19可见.

我只想要URL http://www.example.com/java-training

这可能吗?

Jer*_*son 0

对于问题1。我认为你可以通过改变路线来非常简单地解决这个问题。您不需要将 :title 作为路线的一部分,而是可以在您的情况下对其进行硬编码。我会推荐以下配置。

resources.router.routes.viewbatchcourse.route = "/java-training/:course_id/"
resources.router.routes.viewbatchcourse.defaults.controller = course
resources.router.routes.viewbatchcourse.defaults.action = view-batch
resources.router.routes.viewbatchcourse.defaults.title = java-training
resources.router.routes.viewbatchcourse.reqs.course_id = "\d+"

resources.router.routes.viewreviews.route = "/java-reviews/:course_id/"
resources.router.routes.viewreviews.defaults.controller = course
resources.router.routes.viewreviews.defaults.action = view-reviews
resources.router.routes.viewreviews.defaults.title = java-reviews
resources.router.routes.viewreviews.reqs.course_id = "\d+"
Run Code Online (Sandbox Code Playgroud)

对于问题2。正如你所描述的,根本就没有。