urlManager概览 [ 2.0 版本 ]
urlManager组件由 yii\web\UrlManager 类定义:
class UrlManager extends Component
{
// 用于表明urlManager是否启用URL美化功能,在Yii1.1中称为path格式URL,
// Yii2.0中改称美化。
// 默认不启用。但实际使用中,特别是产品环境,一般都会启用。
public $enablePrettyUrl = false;
// 是否启用严格解析,如启用严格解析,要求当前请求应至少匹配1个路由规则,
// 否则认为是无效路由。
// 这个选项仅在 enablePrettyUrl 启用后才有效。
public $enableStrictParsing = false;
// 保存所有路由规则的配置数组,并不在这里保存路由规则的实例
public $rules = [];
// 指定续接在URL后面的一个后缀,如 .html 之类的。仅在 enablePrettyUrl 启用时有效。
public $suffix;
// 指定是否在URL在保留入口脚本 index.php
public $showScriptName = true;
// 指定不启用 enablePrettyUrl 情况下,URL中用于表示路由的查询参数,默认为 r
public $routeParam = 'r';
// 指定应用的缓存组件ID,编译过的路由规则将通过这个缓存组件进行缓存。
// 由于应用的缓存组件默认为 cache ,所以这里也默认为 cache 。
// 如果不想使用缓存,需显式地置为 false
public $cache = 'cache';
// 路由规则的默认配置,注意上面的 rules[] 中的同名规则,优先于这个默认配置的规则。
public $ruleConfig = ['class' => 'yii\web\UrlRule'];
private $_baseUrl;
private $_scriptUrl;
private $_hostInfo;
// urlManager 初始化
public function init()
{
parent::init();
// 如果未启用 enablePrettyUrl 或者没有指定任何的路由规则,
// 这个urlManager不需要进一步初始化。
if (!$this->enablePrettyUrl || empty($this->rules)) {
return;
}
// 初始化前, $this->cache 是缓存组件的ID,是个字符串,需要获取其实例。
if (is_string($this->cache)) {
// 如果获取不到实例,说明应用不提供缓存功能,
// 那么置这个 $this->cache 为false
$this->cache = Yii::$app->get($this->cache, false);
}
// 如果顺利引用到了缓存组件,那么就将路由规则缓存起来
if ($this->cache instanceof Cache) {
// 以当前urlManager类的类名为缓存的键
$cacheKey = __CLASS__;
// urlManager所有路由规则转换为json格式编码后的HASH值,
// 用于确保缓存中的路由规则没有变化。
// 即外部没有对已经缓存起来的路由规则有增加、修改、
// 删除、调整前后位置等操作。
$hash = md5(json_encode($this->rules));
// cache中是一个数组, 0号元素用于缓存创建好的路由规则,
// 1号元素用于保存HASH值。这个判断用于确认是否有缓存、且缓存仍有效。
// 是的话,直接使用缓存中的内容作为当前的路由规则数组。
if (($data = $this->cache->get($cacheKey)) !== false
&& isset($data[1]) && $data[1] === $hash) {
$this->rules = $data[0];
// 如果尚未缓存或路由规则已经被修改导致缓存失效,
// 那么重新创建路由规则并缓存。
} else {
$this->rules = $this->buildRules($this->rules);
$this->cache->set($cacheKey, [$this->rules, $hash]);
}
// 要么是应用不提供缓存功能,要么是开发者将 $this->cache 手动置为false,
// 总之,就是不使用缓存。那么就直接创建吧,也无需缓存了。
} else {
$this->rules = $this->buildRules($this->rules);
}
}
// 增加新的规则
public function addRules($rules, $append = true){ ... }
// 创建路由规则
protected function buildRules($rules){ ... }
// 用于解析请求
public function parseRequest($request){ ... }
// 这2个用于创建URL
public function createUrl($params){ ... }
public function createAbsoluteUrl($params, $scheme = null){ ... }
}
kenwang
注册时间:2015-11-09
最后登录:2021-11-15
在线时长:12604小时19分
最后登录:2021-11-15
在线时长:12604小时19分
- 粉丝30
- 金钱12605
- 威望20
- 积分138845
热门源码
- 基于 Yii 2 + Bootstrap 3 搭建一套后台管理系统 CMF
- 整合完 yii2-rbac+yii2-admin+adminlte 等库的基础开发后台源码
- 适合初学者学习的一款通用的管理后台
- yii-goaop - 将 goaop 集成到 Yii,在 Yii 中优雅的面向切面编程
- yii-log-target - 监控系统异常且多渠道发送异常信息通知
- 店滴云1.3.0
- 面向对象的一小步:添加 ActiveRecord 的 Scope 功能
- Yii2 开源商城 FecShop
- 基于 Yii2 开发的多店铺商城系统,免费开源 + 适合二开
- leadshop - 基于 Yii2 开发的一款免费开源且支持商业使用的商城管理系统
共 3 条评论
前排,mark
后排,mark
吊车尾,mark