kenwang 2015-12-10 15:31:32 8646次浏览 3条评论 7 6 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){ ... }
}
觉得很赞
您需要登录后才可以评论。登录 | 立即注册