Yii2 路由之同时支持 URL 原始和美化的请求 [ 2.0 版本 ]

来源:互联网 发布:网络计划图绘制软件 编辑:程序博客网 时间:2024/06/03 11:15

1,刚开始的时候,我们使用yi i2时候直接采用的最原始的访问的url方法去访问的。
例子:
http://frontend.domain.com/index.php?r=index/site/index
http://frontend.domain.com/index.php?r=index/article/view&id=1

2,使用yii2的URL美化,
例子:
http://frontend.domain.com/index/site/index.html
http://frontend.domain.com/index/article/view/id/1.html

注意:

启用yi i的URL美化后,URL的原始访问就不能再用了。除非关闭URL美化。

原理

通过查看yii/web/urlManager源码中parseRequest()方法可以发现:
public function parseRequest($request)
{
if ($this->enablePrettyUrl) {

}else{

}
}
parseRequest() 是一个 URL 解析方法,从访问的 URL 中解析出路由,然后 Yii2 根据路由信息构建并调用出相应的模块、控制器、方法等等
源码中对 $this->enablePrettyUrl 做了判断,如果开启美化,那么就不进行原始的解析。反之亦然。

共存

你构建的原始形态的 URL 无法访问到 Yii2 对应的控制器。因为此时 Yii2 启用了 URL 美化,无法将原始形态的 URL 解析到指定的路由。

好在 Yii2 非常灵活,我们重写 urlManager 的 parseRequest() 实现它。
新建文件 common/components/urlManage.php,其内容如下:
<\?php
namespace common\components;

use yii;

/**
* URL 管理器
* 继承官方 URL 管理器,同时支持 URL 原始和美化的请求
*/
class urlManager extends yii\web\urlManager
{
/**
* 解析请求路由
* 同时支持 URL 原始和美化的请求解析
*
* @param yii\web\Request $request
* @return array|bool
*/
public function parseRequest( $request )
{
$route = trim($request->get($this->routeParam));
$enablePrettyUrl =\ $this->enablePrettyUrl;

    if( \$route != '' ) \$this->enablePrettyUrl = false;    \$result = parent::parseRequest(\$request);    if( \$route != '' ) \$this->enablePrettyUrl = \$enablePrettyUrl;    return \$result;}

}
在 应用主体 的配置文件中将该新的 urlManager 类添加;例如编辑 /frontend/config/main.php,添加如下代码:
$configs[‘components’][‘urlManager’] = array(‘class’=>’common\components\urlManager’);
至此,你就可以同时使用以下的 URL 进行访问:
http://frontend.domain.com/index.php?r=index/site/index
http://frontend.domain.com/index.php?r=index/article/view&id=1

http://frontend.domain.com/index/site/index.html
http://frontend.domain.com/index/article/view/id/1.html

注意:前提需要你开启了 URL 的美化,不然 xxx.html 那几个 URL 将无法访问

原创粉丝点击