tp5.1 分组路由和域名路由

route目录下的任何路由定义文件都是有效的,默认的路由定义文件是route.php,但你完全可以更改文件名,或者添加多个路由定义文件(你可以进行模块定义区分,但最终都会一起加载)。
例:

├─route                 路由定义目录
│  ├─route.php          路由定义
│  ├─api.php            路由定义
│  └─...                更多路由定义

路由定义有多种形式和方法,和通过查看官方手册来学习:https://www.kancloud.cn/manual/thinkphp5_1/353962

路由分组:

路由分组功能允许把相同前缀的路由定义合并分组,这样可以简化路由定义,并且提高路由匹配的效率,不必每次都去遍历完整的路由规则(尤其是开启了路由延迟解析后性能更佳)。

格式:

Route::group('分组名(字符串)或者分组路由参数(数组)','分组路由规则(数组或者闭包)');

例:

Route::group('blog', [
    ':id'   => 'Blog/read',
    ':name' => 'Blog/read',
])->ext('html')->pattern(['id' => '\d+']);``````````````````````

路由分组还有很多其他形式的使用,可以查看手册加以实现

调用的方法:

//类为\think\Route
    /**
     * 注册路由分组
     * @access public
     * @param  string|array      $name       分组名称或者参数
     * @param  array|\Closure    $route      分组路由
     * @param  array             $option     路由参数
     * @param  array             $pattern    变量规则
     * @return RuleGroup
     */
    public function group($name, $route, array $option = [], array $pattern = [])
    {
        if (is_array($name)) {
            $option = $name;
            $name   = isset($option['name']) ? $option['name'] : '';
        }

        return (new RuleGroup($this, $this->group, $name, $route, $option, $pattern))
            //是否域名延迟路由解析操作
            ->lazy($this->lazy)
            //是否合并分组数组操作
            ->mergeRuleRegex($this->mergeRuleRegex);
    }

域名路由:

ThinkPHP支持完整域名、子域名和IP部署的路由和绑定功能,同时还可以起到简化URL的作用。

Route::domain('blog', function () {
    // 动态注册域名的路由规则
    Route::rule('new/:id', 'index/news/read');
    Route::rule(':user', 'index/user/info');
});

闭包中可以使用路由的其它方法,包括路由分组,甚至给域名设置MISS路由。

调用的方法:

//类为\think\Route 
/**
     * 注册域名路由
     * @access public
     * @param  string|array  $name 子域名
     * @param  mixed         $rule 路由规则
     * @param  array         $option 路由参数
     * @param  array         $pattern 变量规则
     * @return Domain
     */
    public function domain($name, $rule = '', $option = [], $pattern = [])
    {
        // 支持多个域名使用相同路由规则
        $domainName = is_array($name) ? array_shift($name) : $name;

        if ('*' != $domainName && !strpos($domainName, '.')) {

            $domainName .= '.' . $this->request->rootDomain();
        }

        if (!isset($this->domains[$domainName])) {
            $domain = (new Domain($this, $domainName, $rule, $option, $pattern))
                ->lazy($this->lazy)
                ->mergeRuleRegex($this->mergeRuleRegex);

            $this->domains[$domainName] = $domain;
        } else {
            $domain = $this->domains[$domainName];
            $domain->parseGroupRule($rule);
        }

        if (is_array($name) && !empty($name)) {
            $root = $this->request->rootDomain();
            foreach ($name as $item) {
                if (!strpos($item, '.')) {
                    $item .= '.' . $root;
                }

                $this->domains[$item] = $domainName;
            }
        }

        // 返回域名对象
        return $domain;
    }

延迟路由解析:

新版路由支持延迟路由解析,也就是说你定义的路由规则(主要是分组路由和域名路由规则)在加载路由定义文件的时候并没有实际注册,而是在匹配到路由分组或者域名的情况下,才会实际进行注册和解析,大大提高了路由注册和解析的性能。

// 开启路由延迟解析
'url_lazy_route'         => true,

默认是关闭延迟路由解析的,你可以在应用的app.php配置文件中设置:

总结:

  1. 路由分组可以把匹配范围缩小到一个组的范围,从而提高匹配效率。
  2. 域名路由可以对同一个子域名进行分组,从而缩小匹配范围,提高匹配效率。
  3. 从调用的方法源码可以看出延迟路由解析对分组路由和域名路由都会产生影响,都可以减少路由注册和解析,从而提高其性能

猜你喜欢

转载自blog.csdn.net/change_any_time/article/details/80234498