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

标签 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+"

这非常有效。

现在我有一个新页面 - 其中包含 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/

相关文章:

php - 将对象转换为其子类之一(协变返回类型)的正确 OO 方法是什么?

php - 适用于 blob 的 Azure PHP SAS

php - 将变量从一个 Controller Action 传递到另一个

zend-framework - Zend ACL 动态断言

php - Bootstrap 资源加载在 Linux 和 Windows 中不同

python - 如果路由以 'post/' 开头,Django 与 CreateView 不匹配

php - 组合多个唯一的 MySQL 表并按一列排序

php - 根据互相连接的好友显示好友帖子?

asp.net-web-api - Web Api 2 空字符串参数 GET

java - Play 2.2.1 子项目 vs 子包?