我的任务是用大量预先存在的链接目录重写一个现有网站。为了便于讨论,让我们假设我们不能做任何会改变链接目录的事情。以下是我们正在使用的链接结构的几个示例:
项目页面将是:
www.domain.com/widgets/some-totally-awesome-large-purple-widget
类别子页面页面将是:
www.domain.com/widgets/purple-widgets
类别父页面将是:
www.domain.com/widgets/
自定义页面可能是:
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)? page
是 item
(示例 1)吗?
或
您将 URL 存储在某处(例如数据库中的映射表)并使用 lithium Route 的 pattern
版本.
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/