Yii2 路由之同时支持 URL 原始和美化的请求 [ 2.0 版本 ]
▪ 前言
刚学习 Yii2 的时候我们都是直接采用了 URL 原始访问方法:
http://frontend.domain.com/index.php?r=index/site/index
http://frontend.domain.com/index.php?r=index/article/view&id=1
...
经过一段时间的学习,我们又学会了 URL 美化:
http://frontend.domain.com/index/site/index.html
http://frontend.domain.com/index/article/view/id/1.html
...
但是你有没有发现:启用了 URL 美化之后,URL 原始的访问方法就不能再用了,除非你关闭 URL 美化。
▪ 原理
通过查看 yii\web\urlManager
源码中的 parseRequest()
方法我们可以发现其中的奥秘:
public function parseRequest($request)
{
if ($this->enablePrettyUrl) {
...
}else{
...
}
}
parseRequest() 是一个 URL 解析方法,从访问的 URL 中解析出路由,然后 Yii2 根据路由信息构建并调用出相应的模块、控制器、方法等等
源码中对 $this->enablePrettyUrl 做了判断,如果开启美化,那么就不进行原始的解析。反之亦然。
▪ 共存
通常情况下,我们的项目都会开启 URL 美化。但是有时个别 URL 为保证其通用性,你可能需要为其构建原始形态来访问。
不要问为什么会有这么奇怪的需求,看看下面的解决方法,当你如果真遇到这样的需求时你就能这样处理了
但是很不幸,你构建的原始形态的 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 将无法访问
mycjk31
注册时间:2017-06-07
最后登录:2024-08-24
在线时长:10小时38分
最后登录:2024-08-24
在线时长:10小时38分
- 粉丝7
- 金钱150
- 威望130
- 积分1550
共 1 条评论
只要不强制严格的url解析就可以了,另外也可以定义规则模仿原本的写法定义。这样可以更快的实现你要的结果
恩嗯,我试试