php-自定义锂路由方案
作者:互联网
我的任务是重写具有大型现有链接目录的现有网站.为了论证,我们假设我们无法做任何会改变链接目录的事情.以下是我们正在使用的链接结构的一些示例:
>项目页面为:
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控制器,后者再使用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()中搜索正确的内容.毕竟,该类别是页面吗(示例4)?该页面是一个项目(示例1)吗?
要么
您将网址存储在某处(例如数据库中的映射表),并使用lithium Route的模式版本.
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.
标签:url-routing,lithium,php 来源: https://codeday.me/bug/20191201/2084408.html