### 执行流程
上一节大家已经了解了路由的基本概念和简单用法,本篇就来详细了解下路由的工作原理和执行流程。
路由的执行过程主要分为三大部分:路由注册、路由检查和路由解析,而每个部分又包含很多步骤。
#### 注册路由
要使用路由功能,必须确保开启路由功能:
~~~
// 开启路由功能
'url_route_on' => true,
~~~
> 【5.1须知】
> 不需要配置开启路由,默认开启且不能关闭
然后进行路由规则的注册(或者说定义),路由的注册包括单个路由、路由分组、路由别名、资源路由、变量规则注册以及域名路由注册等等。
对于开发者来说,路由的主要工作就是注册路由(上面提及的注册环节我们在后面的内容中都会陆续讲解),而路由的匹配和解析一般是由系统自动完成的。
注册路由的时候会把路由规则注册到对应的请求类型(包括`GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS`)数组,如果是`any`或者`rule方法`直接注册的(也包括批量导入的)则会注册到一个默认的`*请求类型`(代表全部请求类型有效),但同时也会分别在各个请求类型的路由规则里面注册一个快捷方式(使用true注册),告诉系统当前请求类型的该路由规则请直接获取`*`中的路由规则定义。
#### 路由配置
如果在应用配置中关闭了路由功能的话
~~~
// 关闭路由功能
'url_route_on' => false,
~~~
则不会进行路由的注册和检测,前面我们提过不要在路由配置文件之外进行路由注册,因为如果你是在应用的公共函数文件中注册了路由,即使你关闭路由也仍然会去注册路由,虽然没有任何意义。
最关键的一点是不在路由配置文件中注册的路由无法进行路由缓存。
5.0的路由配置是不支持在模块配置文件中定义的,因为在读取模块之前,路由已经检测完成了。如果你想做的是给不同模块注册的路由规则能够分开不同的文件,便于开发的时候分工协作,那其实是有办法的,只需要修改应用配置文件中的下面参数:
~~~
// 设置路由配置文件列表
'route_config_file' => ['home','admin'],
~~~
`application/home.php`配置`home模块`的路由规则,`application/admin.php`则配置`admin模块`的路由规则。
虽然运行的时候依然会同时加载并注册,但定义的时候是明确分开了,便于协作。因此路由配置文件不一定是route.php。
> 【5.1须知】
> 直接可以在route目录下面添加不同模块的路由定义文件,无需配置
#### 注册方法
完成路由注册功能的方法有很多,包括:
|方法名 |描述|
|--|--|
|rule |基本路由注册|
|any |任意请求路由注册|
|get |GET请求路由注册|
|post |POST请求路由注册|
|put |PUT请求路由注册|
|patch |PATCH请求路由注册|
|delete |DELETE请求路由注册
|alias |别名路由注册|
|group |路由分组注册|
|controller |控制器方法路由注册|
|resource |资源路由注册|
|pattern |全局路由变量规则注册|
|import |静态注册路由(导入路由配置)|
|domain |域名路由注册或者域名绑定|
|miss |MISS路由注册|
|auto |AUTO路由注册|
这些路由注册方法中最基本的就是rule方法,其它大部分注册方法都是调用该方法。
路由注册其实有一些比较特殊的情况,比如分组路由就是先注册一个路由分组,然后在分组下面再注册实际的路由规则,同时这些路由规则可以公用所属路由分组的参数及变量规则,免得重复定义。关于路由分组和一些特殊路由的用法,我们会在后面单独讲解,暂且不必深究。
路由注册后,你可以通过下面的方法查看所有的路由规则(包括路由变量、域名和别名等信息):
~~~
// 获取全部的路由信息
Route::rules();
// 获取GET路由信息
Route::rules('GET');
~~~
> 【5.1须知】
5.1路由的存储方式改为对象存储,所以rules方法作用已经改变
#### 路由缓存
路由注册是在每次请求的时候完成,然后再进行路由检查。那么问题来了,为啥每次都要重复注册路由规则呢,能否把路由规则缓存起来?
答案是当然可以,在开发阶段由于会进行路由的调整,当实际部署上线的时候,其实路由规则就不会变化了,那么我们就可以把路由规则缓存起来,以后的每次请求就不需要重复执行路由注册操作了,能够提高不少的性能(尤其你的路由规则相当多的情况下)。
缓存路由很简单,到操作系统的命令行下面,在应用根目录下面执行命令:
~~~
php think optimize:route
~~~
执行后会在`runtime`目录下面生成一个`route.php`路由缓存文件,再次请求的时候就会直接读取缓存文件里面的路由规则。
注册和读取路由规则的关键代码在 `think\App`类的`routeCheck`方法,主要代码如下:
~~~
if (is_file(RUNTIME_PATH . 'route.php')) {
// 读取路由缓存
$rules = include RUNTIME_PATH . 'route.php';
if (is_array($rules)) {
Route::rules($rules);
}
} else {
$files = $config['route_config_file'];
foreach ($files as $file) {
if (is_file(CONF_PATH . $file . CONF_EXT)) {
// 导入路由配置
$rules = include CONF_PATH . $file . CONF_EXT;
if (is_array($rules)) {
Route::import($rules);
}
}
}
}
~~~
路由缓存只会缓存在路由配置文件(确切的说是`route_config_file`配置的文件列表)中定义的路由规则(包括动态注册和静态注册的规则),所以再次强调,不要在路由配置文件之外注册路由规则,否则将享受不到路由缓存带来的性能提升。
> 【5.1须知】
5.1的路由注册支持延迟注册,性能大幅提升,因此不需要路由缓存,该指令的作用变化,如果需要使用路由反解的话 可以执行该指令生成缓存。
#### 路由检查
路由检查指的是把当前的请求URL地址依次和注册的路由规则进行变量和条件检查,如果不匹配则进行下一个路由规则的检查,直到匹配到正确的路由规则则进入下一步:**路由解析**。如果没有匹配到任何路由规则,则按照系统默认的规则进行URL解析。
路由检测的路由规则是当前请求类型的路由规则,其它请求类型的路由就没必要浪费时间一起检查了,下面的代码就是获取当前请求类型的路由规则。
~~~
$method = $request->method();
// 获取当前请求类型的路由规则
$rules = self::$rules[$method];
~~~
路由注册的基本方法如下:
~~~
Route::rule('路由规则','路由地址','请求类型','路由参数(数组)','变量规则(数组)');
~~~
* * * * *
https://www.kancloud.cn/thinkphp/route-master/223110