3

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

  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 控制器,该控制器又使用 URL 路径作为键来查询数据库。

4

2 回答 2

2

如果您在 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()搜索正确的东西。那毕竟是(示例4)吗categorypagepageitem(示例1)吗?

或者

您将 URL 存储在某处(例如数据库中的映射表)并使用锂 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。

于 2012-01-04T09:32:09.947 回答
1

您可能应该编写一个智能路由器助手,它可能能够根据您的数据库定义的路由处理您的请求。

看看:net/http/Router.php

尤其是 connect()、parse() 和 match()

我会开始编写某种匿名函数并将其推进到位于 /extension.. 中的可测试类?

于 2012-01-04T10:03:37.980 回答