编程语言
首页 > 编程语言> > php-自定义锂路由方案

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