ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
### 执行流程 上一节大家已经了解了路由的基本概念和简单用法,本篇就来详细了解下路由的工作原理和执行流程。 路由的执行过程主要分为三大部分:路由注册、路由检查和路由解析,而每个部分又包含很多步骤。 #### 注册路由 要使用路由功能,必须确保开启路由功能: ~~~ // 开启路由功能 '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