ThinkPHP02:路由
ThinkPHP02:路由
- 一、路由定义
- 二、变量规则
- 三、路由地址
- 四、路由参数
- 五、路由分组
- 六、MISS
- 七、资源路由
- 八、注解路由
- 九、URL生成
一、路由定义
-
路由默认开启,在 config/app.php 中可以关闭路由。
-
路由配置在 config/route.php 中,路由定义在 route/app.php 中。
-
rule()
默认请求是any。Route::rule("details/:id", "Address/details", "GET|POST");
-
其他的有 get、post等。
Route::get("details/:id", 'Address/details');
二、变量规则
-
系统默认路由变量规则是 \w+,即字母、数字、中文和下划线,在 config/route.php 中可更改。
-
在路由中设置变量规则。
Route::get("details/:id", 'Address/details')->pattern(["id" => '\d+']);
-
动态组合拼装,地址和参数都是动态的。
Route::get("hello-<name>-<id>", 'Hello:name/details')->pattern(["id" => '\d+']);
-
闭包路由可以通过URL直接执行,而不需要控制器和方法,也支持传递参数和动态规则。
Route::get('think/:name', function ($name) { return 'hello, '.$name.'!'; });
三、路由地址
-
路由地址一般为:控制器/操作方法。
-
多级控制器路由。
Route::rule('blog/:id', 'group.Blog/details');
-
完整路径
Route::rule('ds/:id', "\app\controller\Address@details");
-
路由重定向
Route::redirect("ds/:id", "http://localhost:8000", 302);
四、路由参数
-
设置路由时,可以设置相关的方法,实施匹配检测和行为执行。
-
ext()
方法用于检测URL后缀、强制所有URL后缀,denyExt()
禁止使用后缀。Route::get("details/:id", 'Address/details')->ext('html|shtml');
-
https()
方法用于检测是否为 https 协议。Route::get("details/:id", 'Address/details')->https();
-
domain()
方法检测当前域名是否匹配,完整域名和子域名均可。Route::get("details/:id", 'Address/details')->domain("localhost");
-
ajax/pjax/json
用于检测当前的页面是否是以上请求方式。Route::get("details/:id", 'Address/details')->ajax();
-
filter()
用于检测额外参数,额外参数可以表单提交。Route::get("details/:id", 'Address/details')->filter(['id' => 5, "type" => 1]);
-
append()
方法用于追加额外参数。Route::get("details/:id", 'Address/details')->append(['status' => 1]);
-
allowCrossDomain()
方法可以解决跨域请求。oute::get("details/:id", 'Address/details')->allowCrossDomain([ "Access-Control-Allow-Origin" => "*" ]);
-
option()
用于配置多个参数Route::get("details/:id", 'Address/details')->option([ 'ext' => 'html', 'https' => true ]);
五、路由分组
-
路由分组可以将相同前缀的路由合并分组,简化路由定义。
Route::group("address", function () { Route::rule("ds/:id", "/details"); Route::rule("rd/:id", "/read"); })->prefix('Address');
-
路由规则定义的文件,加载时会解析消耗较多资源,可以在 config/route.php 中开启延迟解析,在匹配的时候才会注册解析。
'url_lazy_route' => true,
六、MISS
-
MISS在匹配不到相应规则时会自动跳转到 MISS。
-
全局MISS。
# app/controller/Error.php public function miss() { return "404 Not Found"; } # route/app.php Route::miss('public/miss');
-
分组MISS
# app/controller/Address.php public function miss() { return '404 Address'; } # route/app.php Route::group("address", function () { Route::rule("ds/:id", "/details"); Route::rule("rd/:id", "/read"); Route::miss("miss"); })->prefix('Address');
七、资源路由
-
系统提供了快速生成资源控制器的命令。
php think make:controller Blog
-
注册资源路由,注册成功后,会自动提供CURD方法,无需手动注册,请求方式有GET、POST、PUT、DELETE。
Route::resource('blog', 'Blog'); # 自动注册 http://localhost:8000/blog/ (index) http://localhost:8000/blog/5 (read) http://localhost:8000/blog/5/edit (edit)
-
默认参数采用id名称。也可以自定义
# route/app.php Route::resource('blog', 'Blog')->vars(['blog' => 'blog_id']); # app/controller/Blog.php public function read($blog_id) { return "显示指定的资源: ". $blog_id; }
-
only()
用于限定资源方法,except()
用于排除系统提供的资源方法。Route::resource('blog', 'Blog')->only(['index', 'read']); Route::resource('blog', 'Blog')->except(['delete', 'update']);
-
rest()
更改系统给予的默认方法,放在resource方法前面。资源路由的标识不可更改,但生成的路由规则和对应操作方法可以修改。# rest方法要放在resource前面 Route::rest([ # 资源路由标识 => 请求方式,请求地址,操作方法 'save' => ["POST", "/:id/save", "save"], 'update' => ["PUT", "/:id", "update"], ]); Route::resource('blog', 'Blog');
-
使用资源嵌套路由,可以让上级资源对下级资源进行操作。
# app/controller/Comment.php class Comment { public function read($id, $blog_id) { return "评论ID:" . $id . ",博客ID:" . $blog_id; } public function edit($id, $blog_id) { return "评论ID:" . $id . ",博客ID:" . $blog_id; } } # route/app.php 注册资源嵌套路由 Route::resource("blog.comment", "Comment"); # 路由规则 http://localhost:8000/blog/:blog_id/comment/:id
八、注解路由
-
注解路由是在注解中写的路由,项目很简单时使用。
-
路由注解方式,并非系统默认支持,而是可选方案,需要额外安装扩展。
composer require topthink/think-annotation
-
在控制器中写路由,必须使用双引号。单引号不能解析
# app/controller/Address.php use think\annotation\Route; class Address { /** * @param $id * @return string * @route("ds/:id", method="GET", https=1); */ public function details($id) { return '详情id:' . $id; } }
-
注解模式也支持资源路由和分组。
use think\annotation\Route\Resource; /** * Class Blog * @package app\controller * @Resource("blog"); */ class Blog { ... }
九、URL生成
-
使用
buildUrl()
获取路由的URL地址。默认后缀是html,可以使用suffix()
更改。使用domain()
可以生成加上域名的URL。Route::buildUrl("Url/details", ['id' => 8])->suffix('shtml')->domain(true);
-
可以给路由定义一个别名,生成URL时使用别名调用。
-
可以直接使用路由地址生成URL。
-
助手函数
url()
可以直接代替Route::buildUrl()
url(ds/5)->domain(true);