php - 自定义锂路由场景

标签 php url-routing lithium

我的任务是用大量预先存在的链接目录重写一个现有网站。为了便于讨论,让我们假设我们不能做任何会改变链接目录的事情。以下是我们正在使用的链接结构的几个示例:

  1. 项目页面将是:

    www.domain.com/widgets/some-totally-awesome-large-purple-widget
    
  2. 类别子页面页面将是:

    www.domain.com/widgets/purple-widgets
    
  3. 类别父页面将是:

    www.domain.com/widgets/
    
  4. 自定义页面可能是:

    www.domain.com/some-random-page
    

各种页面类型太多,无法为其编写单独的路由器。

使用 Router::connect 我可以很容易地解释第一种和第二种情况:

Router::connect('/{:pageroot}/{:pagekey}', 'Pages::index');

然后,Pages::index 方法在我们的数据库中查找“键”为“/widgets/purple-widgets”的条目。

但是,对于第三个和第四个页面,框架默认使用 '/{:controller}/{:action}/{:args}' 路由。我知道这是框架的正确行为。此外,最佳实践会声明我应该编写站点以匹配此行为。但是,这不是一个选项。

我需要的是一个路由器,它可以让第三个和第四个示例的功能与第一个示例相同。所有示例都应发送到 Pages::index Controller ,后者会使用 URL 路径作为键来查询数据库。

最佳答案

如果您在 URL 中没有关于页面、项目和类别之间的任何约定。我会选择一个非常通用的路由器。

Router::connect('/{:category}/{:page}/{:item}', 'Pages::any');
Router::connect('/{:category}/{:page}', array('Pages::any', 'item' => null));
Router::connect('/{:category}', array('Pages::any', 'page' => null, 'item' => null));

并在 Pages::any() 中搜索正确的内容。那 category 毕竟是 page 吗(示例 4)? pageitem(示例 1)吗?

您将 URL 存储在某处(例如数据库中的映射表)并使用 lithium Routepattern 版本.

Router::connect(new Route(array(
    'pattern' => '@^/(?<path>.+)$@',
    'params' => array('controller' => 'pages', 'action' => 'any'),
    'keys' => array('path' => 'path'),
    // extra stuff, if the path is `tata`, it skips this route and uses
    // any of the following ones that matches.
    'handler' => function($request) {
        if ($request->params['path'] == 'tata') {
            return false;
        } else {
            return $request;
        }
    }
)));

从那时起,您将获得完整的 URL。

关于php - 自定义锂路由场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8717119/

相关文章:

javascript - 如何在 PHP 网络应用程序上安全地使用 Firebase Auth

javascript - 简单的前端 Controller 导致 php 中的 css 和 javascript 损坏

http - 为什么我需要使用 http.StripPrefix 来访问我的静态文件?

php - 锂通用型号过滤器

php - 如何在模型中使用带有枚举集合列表和更改集合的 Lithium PHP 框架

php - 从 Lithium find 中排除结果

php - 使用 UserFrosting 的 OpenCart 错误重定向

php - 合并两个数组而不更改键值php

php - 无法打开输入文件 :/usr/local/bin/composer. phar

ruby-on-rails - 如何验证为 Rails 应用程序中的所有路由定义了 Controller 操作?