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
热门源码
- 整合完 yii2-rbac+yii2-admin+adminlte 等库的基础开发后台源码
- 基于 Yii 2 + Bootstrap 3 搭建一套后台管理系统 CMF
- 适合初学者学习的一款通用的管理后台
- yii-goaop - 将 goaop 集成到 Yii,在 Yii 中优雅的面向切面编程
- yii-log-target - 监控系统异常且多渠道发送异常信息通知
- 店滴云1.3.0
- 面向对象的一小步:添加 ActiveRecord 的 Scope 功能
- Yii2 开源商城 FecShop
- 基于 Yii2 开发的多店铺商城系统,免费开源 + 适合二开
- leadshop - 基于 Yii2 开发的一款免费开源且支持商业使用的商城管理系统







共 3 条评论
前排,mark
后排,mark
吊车尾,mark