# 多请求类型路由 当我们一个url需要多种请求方式来访问的时候可以定义`rule`类型的路由,例如:(这里的/非必须,但是建议加上) ~~~ Route::rule('/', 'index/index@index', ['get', 'post']); ~~~ 第三个参数传入请求方式数组,可以为空,为空默认为`get`和`post` # 正则表达式与参数传递 在上面提到了路由是可以给控制器方法或者闭包传递参数的。 例如我定义了一个如下的路由 ~~~ Route::get('/article/index(\d+)\.html', 'index/article@read'); ~~~ 该路由的第一个参数是一个不带定界符的正则表达式,该表达式会匹配`/article/index任意数字.html`的请求地址,这个正则中使用了一个匹配组`(\d+)`,并且这个组是第一次出现的,那么就可以在控制器方法或者闭包中传入一个参数。 > 给闭包传参 ~~~ Route::get('/article/index(\d*)\.html',function($id = 0){ echo $id; }); ~~~ > 注意:这里的闭包是可以实现依赖注入的 > 给控制器方法传参 ~~~ public function read($id = 0){ echo $id; } ~~~ 可以传入多个参数,匹配组出现的顺序就是传递给方法或者闭包的参数顺序,例如: ~~~ Route::get('/(\w+)-index(\d+)\.html',function($a,$b){ echo $a,$b; }); ~~~ 访问`blog-index2.html` 时会输出`blog` 和 `2` > 注意:正则路由中的正则不需要添加定界符,多个参数是按匹配到的顺序传递的。转义符号务必使用反斜线,否则url助手函数可能不能正确获取到正则路由的地址 # 路由支持注册别名,例如 ~~~ Route::get('/','index/index@index')->alias('index'); ~~~ 之后就可以在任意位置使用`url`助手函数获取路由地址,例如`url('index')` 返回`/`,如果`url()` 函数中传入的参数并没有被注册别名,那么会原样返回。`url`函数可以添加第二个参数来给正则路由传递参数,例如 ~~~ Route::get('/b(.*)\.html','index/index@index')->alias('blog'); ~~~ 此时可以使用`url('blog',[1]);` 生成的`url`地址为`/b1.html` ,这里`url`的第二个参数为一个索引数组,参数按照在数组中的顺序传递。 # 路由可以设置缓存 > 缓存目前因为一个重大问题暂时不要使用,当路由中不存在闭包时候没有影响 ~~~ php max route //根据提示选择选项 ~~~ 设置缓存文件后路由不会再通过调用`/route`下文件中的大量方法来注册,而是直接从缓存文件中读取,所以在开发环境上建议不要使用路由缓存,否则新增或删除路由不能及时更新 # 其他规则路由 > None路由 使用 ~~~ Route::none(function(){ //return view('index/index'); },$data = []); ~~~ 创建一个`none`路由,当所有路由未匹配到时会匹配该路由,需要给第一个参数传入一个闭包,第二个参数可选地传入一个索引数组,数组的每一个值都会按照数组的索引顺序传入闭包中,闭包中需要有相应形参或其他方式来获取传值。 > 视图路由 ~~~ Route::view('index','index/index',['get']); ~~~ 该路由表示`get`方式请求的`/index`会被映射到`views`目录下的`index`目录下的`index.html`模板文件,分隔符后最后的部分为模板文件名,前面均为目录名。最后一个参数为可选参数,为空默认为`get` 方式请求的路由; > 重定向路由 ~~~ Route::redirect('index','https://www.1kmb.com',302,['get']); ~~~ 该路由表示`get`方式请求的`/index`会被重定向到`https://www.1kmb.com`。后两个参数为可选参数,第一个为跳转状态码,默认为`302`;第二个为请求方式,默认为['get']; # 跨域支持 > 框架支持跨域功能,在定义路由的时候可以设置跨域,可以设置全局跨域,只需要更改配置文件中的app.php中的`middleware`中加上`\Max\Http\Middleware\GlobalCross::class`中间件即可 ~~~ Route::get('/','index/index/index')->cors('*'); ~~~ > 注意:这里cors() 方法的参数可选,参数一:$AllowOrigin 允许跨域域名,可以设置一个'*'或者字符串完整url或者数组的完整url,参数二:$AllowCredentials 是否可以将对请求的响应暴露给页面,参数三:$AllowHeaders 允许的头信息,参数四Maxage预检缓存有效期