ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## **路由文件的地址** 没有全局路由定义的概念 单应用:/与public同级的route/route.php 多应用(admin应用):app/admin/route/route.php ## **注册路由** >[info] Route::rule('路由表达式', '路由地址(模块/控制器/方法)', '请求类型 默认*'); > ~~~ >Route::rule('new/:id','News/read','GET|POST'); >~~~ ## **快捷注册** Route::快捷方法名('路由表达式', '路由地址'); ~~~ Route::get('new/<id>','News/read'); // 定义GET请求路由规则 Route::post('new/<id>','News/update'); // 定义POST请求路由规则 Route::put('new/:id','News/update'); // 定义PUT请求路由规则 Route::delete('new/:id','News/delete'); // 定义DELETE请求路由规则 Route::any('new/:id','News/read'); // 所有请求都支持的路由规则 //是对PUT方法的补充,用来对已知资源进行局部更新 Route::patch('new/:id','News/patch'); // 定义PATCH请求路由规则 ~~~ 路由地址: >``` >// 默认应用 >'default_app' =>'index' >// 默认控制器名 >'default_controller' => 'Index', >``` >~~~ >// 路由到非默认的admin模块和控制器 如:app/admin/controller/Blog.php >Route::rule('blog/:id', 'admin/blog/read'); > >// 路由到默认应用 非默认控制器 如:如app/index/controller/Blog.php >Route::rule('blog/:id', 'blog/read'); > >// 当路由到配置的默认应用及的默认控制器名 如app/index/controller/Index.php >Route::rule('blog/:id', 'read'); > Route::rule('blog/:id', 'index/index/read'); > >//多级控制 > Route::rule('blog/:id', 'index/group.blog/read');//路由到index/controller/group/Blog.php >~~~ 例子: ~~~ /* 单应用模式下 输入:http://serverName/new/5会自动路由到:http://servername/news/read/id/5 */ // 注册路由到News控制器的read操作 Route::rule('new/:id','News/read'); /* 多应用模式下 输入:http://serverName/admin/new/5会自动路由到:http://servername/news/read/id/5 */ // 注册路由到app/admin/News控制器的read操作 Route::rule('new/:id','News/read'); 或者: Route::rule('new/:id','admin/News/read'); ~~~ >[danger]总结: 多应用模式下,**应用名**在rule定义时可以省略,url访问时必须加上 ## **可选变量**[ ] 支持对路由参数的可选定义,例如: ~~~ Route::get('blog/:year/[:month]','Blog/archive'); // 或者 Route::get('blog/<year>/<month?>','Blog/archive'); ~~~ 以上定义路由规则后,下面的URL访问地址都可以被正确的路由匹配: ~~~ http://serverName/index.php/blog/2015 http://serverName/index.php/blog/2015/12 ~~~ >[danger]可选参数只能放到路由规则的最后,如果在中间使用了可选参数的话,后面的变量都会变成可选参数。 ## **完全匹配** 如果需要全局进行URL完全匹配,可以在路由配置文件中设置 ~~~ // 开启路由完全匹配 'route_complete_match' => true, ~~~ 规则匹配检测的时候默认只是对URL从头开始匹配,只要URL地址开头包含了定义的路由规则就会匹配成功,如果希望URL进行完全匹配,可以在路由表达式最后使用`$`符号,例如: ~~~ Route::get('new/:cate$', 'News/category'); ~~~ 这样定义后 ~~~ http://serverName/index.php/new/info 匹配成功 http://serverName/index.php/new/info/2 匹配失败 ~~~ ## **额外参数** 在路由跳转的时候支持额外传入参数对(额外参数指的是不在URL里面的参数,隐式传入需要的操作中,有时候能够起到一定的安全防护作用,后面我们会提到)。例如: ~~~ Route::get('blog/:id','blog/read') ->append(['status' => 1, 'app_id' =>5]); ~~~ 上面的路由规则定义中`status`和`app_id`参数都是URL里面不存在的,属于隐式传值,当然并不一定需要用到,只是在需要的时候可以使用。 >[danger] 如果`append`方法中的变量和路由规则存在冲突的话,append方法传入的优先。 ## **路由标识** 如果你需要快速的根据路由生成URL地址,可以在定义路由的时候指定生成标识(但要确保唯一)。 例如 ~~~ // 注册路由到News控制器的read操作 Route::rule('new/:id','News/read') ->name('new_read'); ~~~ 生成路由地址的时候就可以使用 ~~~ url('new_read', ['id' => 10]); ~~~ 如果不定义路由标识的话,系统会默认使用路由地址作为路由标识,例如可以使用下面的方式生成 ~~~ url('News/read', ['id' => 10]); ~~~ ## **强制路由** 在路由配置文件中设置 ~~~ 'url_route_must' => true, ~~~ 将开启强制使用路由,这种方式下面必须严格给每一个访问地址定义路由规则(**包括首页**),否则将抛出异常。 首页的路由规则采用`/`定义即可,例如下面把网站首页路由输出`Hello,world!` ~~~ Route::get('/', function () { return 'Hello,world!'; }); ~~~ ## **规则表达式** 规则表达式通常包含静态规则和动态规则,以及两种规则的结合,例如下面都属于有效的规则表达式: ~~~ Route::rule('/', 'index'); // 首页访问路由 Route::rule('my', 'Member/myinfo'); // 静态地址路由 Route::rule('blog/:id', 'Blog/read'); // 静态地址和动态地址结合 Route::rule('new/:year/:month/:day', 'News/read'); // 静态地址和动态地址结合 Route::rule(':user/:blog_id', 'Blog/read'); // 全动态地址 ~~~