ThinkPHP6是一款强大的PHP框架,拥有便捷的路由功能,可以轻松实现URL路由配置;同时支持多种路由模式,如GET、POST、PUT、DELETE等等。本文将介绍如何使用进行路由注册(包括基础:路由定义、请求方式、规则表达式和参数传递),路由配置
一.路由使用注意事项
①路由的使用首先要使用符合规范的命名空间,这样才能控制器才能正常访问;
②然后还要通过引用门面中的路由方法
③多应用模式下,分为应用路由和全局路由。应用内部可以创建admin/route/app.php定义应用内部路由;而根目录下route/app.php是全局路由,一般用配置默认路由,也就是用户访问路由;应用路由的执行要优先于全局路由,也就是程序会先执行应用内的路由。
④在config/route.php文件是全局路由配置,如是否设置强制路由,也就是只能通过路由访问
// 是否强制使用路由
'url_route_must' => true,
二.路由配置文件,注册路由到控制器中到方法
在路由文件中定义规则,所有的路由规则都在这个文件(根目录下route/app.php是全局路由,应用内部可以创建admin/route/app.php定义应用内部路由,程序会先执行应用内的路由)中配置,
在根目录route/app.php文件中定义全局路由,主要用于前台访问
创建应用内部路由,在admin应用下创建route/app.php,并加入以下代码
三.路由基本知识
3.1. 路由注册
3.1.1路由注册需要使用Route类
use think\facade\Route
3.1.2基础路由定义
# Route::rule('路由表达式' , '路由地址' , '请求方式')
Route::rule('test' , 'test/test' , 'get');
3.1.3 常用于项目中的路由分为五种:get/post/put/delete/any
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'); // 所有请求都支持的路由规则
3.1.4在ThinkPHP6中,路由配置文件位于route目录下,通常为route/app.php。基本路由配置包括HTTP请求方法、路由地址和路由参数。以下是一个基本路由配置示例:
use think\route\Rule;
// 定义GET请求的路由
Route::get('hello', 'index/hello');
// 定义POST请求的路由
Route::post('hello', 'index/hello');
3.2ThinkPHP6路由模式
1. GET方式:GET方式是用于获取数据的一种方式,常用于页面展示。在ThinkPHP6中,可以使用如下代码来配置GET方式路由:
Route::get('路由地址', '控制器/方法');
Route::get('index', 'Index/index');
这段代码将路由地址‘index’映射到控制器‘Index’的‘index’方法。
2. POST方式:POST方式是用于提交数据的一种方式,常用于数据的添加、修改、删除等操作。在ThinkPHP6中,可以使用如下代码来配置POST方式路由:
Route::post('路由地址', '控制器/方法');
Route::post('user/add', 'User/add');
这段代码将路由地址‘user/add’映射到控制器‘User’的‘add’方法。
3. PUT方式:PUT方式是用于修改数据的一种方式,常用于数据的更新操作。在ThinkPHP6中,可以使用如下代码来配置PUT方式路由:
Route::put('路由地址', '控制器/方法');
Route::put('user/update', 'User/update');
这段代码将路由地址‘user/update’映射到控制器‘User’的‘update’方法。
4. DELETE方式:DELETE方式是用于删除数据的一种方式,常用于数据的删除操作。在ThinkPHP6中,可以使用如下代码来配置DELETE方式路由:
Route::delete('路由地址', '控制器/方法');
Route::delete('user/del', 'User/del');
这段代码将路由地址‘user/del’映射到控制器‘User’的‘del’方法。
3.3ThinkPHP6路由参数
在ThinkPHP6中,路由参数是非常重要的一部分,路由参数用于接收URL中的动态数据。在定义路由时,可以通过以下方式指定参数,将变量作为参数传递给控制器方法。
3.3.1. 基本用法
在路由中使用参数,可以使用如下代码:
Route::get('路由地址/:变量名', '控制器/方法');
Route::get('user/:id', 'User/index');
这段代码将路由地址‘user/:id’映射到控制器‘User’的‘index’方法,并将id作为参数(其中:id表示一个路由参数,它将匹配URL中的对应部分。)传递给该方法。
3.3.2. 参数限制
在路由中传递参数时,有时候需要对参数进行限制。在ThinkPHP6中,可以使用正则表达式对传递的参数进行限制。例如,限制参数只能为数字:
Route::get('user/:id(d+)', 'User/index');
这样在传递参数时,如果参数不符合要求,则会抛出异常。
// 定义带有参数的路由
Route::get('user/:id', 'user/info');
# 访问路径 <hostname>/test/id
# 获取路由传递的参数
public function test($id){
return $id;
}
3.4、ThinkPHP6路由分组
在进行路由配置时,有时需要对路由进行分类,方便管理和维护。在ThinkPHP6中,可以使用路由分组功能来实现。
Route::group('分组名称', function(){
Route::get('路由地址', '控制器/方法');
});
Route::group('admin', function(){
Route::get('user', 'Admin/User/index');
Route::post('user', 'Admin/User/add');
Route::delete('user/:id', 'Admin/User/del');
});
这段代码将所有路由地址以‘admin’为前缀进行分组,其中‘user’为子路由,映射到控制器‘Admin/User’的相应方法。
// 定义路由分组
Route::group('admin', function () {
Route::get('index', 'admin/index');
Route::get('login', 'admin/login');
});
路由分组可以将多个具有相同前缀的路由分为一组,提高路由管理的效率。以下是一个路由分组的示例:
3.5ThinkPHP6路由快捷方法
在ThinkPHP6中,有一些快捷的路由方法可以方便使用者进行路由配置。
3.5.1. REST接口路由
REST即表述性状态传递,是一种架构风格,常用于Web接口开发。在ThinkPHP6中,可以使用REST接口路由进行配置。
Route::resource('路由地址', '控制器');
Route::resource('user', 'User');
这段代码将路由地址‘user’映射到控制器‘User’的相应方法,即获取用户信息、添加用户、修改用户、删除用户等操作。
3.5.2. 全局路由
全局路由是在应用初始化时进行自动路由配置,常用于特殊情况下的路由需求。
Route::miss('路由地址');
Route::miss('Error/index');
这段代码将所有未匹配的路由地址映射到控制器‘Error’的‘index’方法,即出现404错误时前往此页面进行处理。
3.6、路由命名与反向解析
为方便在代码中引用路由,可以为路由设置命名。同时,ThinkPHP6支持路由反向解析,通过路由名称生成URL。以下是一个示例:
// 定义命名路由
Route::get('user/:id', 'user/info')->name('user_info');
// 生成URL
$url = url('user_info', ['id' => 1]);
3.7路由变量
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'); // 全动态地址
3.8路由标识
# 快速生成url地址可以在路由定义时生成指定且唯一的标识
Route::post('test' , 'test/test')->name('test_test');
# 调用
url('test_test');
# 如果不用标识 则会以路由地址作为标识
url('test/test');
方式一:使用路由标识
Route::rule('blog/:id','blog/read')->name('blog_read');
Route::buildUrl('blog_read', ['id' => 5, 'name' => 'thinkphp']);
//或者助手函数
url('blog_read', ['id' => 5, 'name' => 'thinkphp']);
在视图中使用
{:url('blog_read', ['id' => 5, 'name' => 'thinkphp']);}
式二:使用路由地址
假设定义如下路由
Route::get('blog/:id' , 'blog/read');
Route::buildUrl('/blog/5');
在视图中要传递自定义参数用.
来拼接
{:url('/blog/'.$article->id)}
3.9路由地址
3.9.1控制器/操作
# 访问的是Test内的test方法
Route::get('test' , 'test/test');
# 支持多级控制器
# 访问的是controller内的Test类test方法
Route::get('test' , 'controller.test/test');
3.9.2路由到类
# 路由访问不一定是控制器的类 可以访问别的类
# \完整类名@方法名 或 \完整类名::方法名
Route::get('test' , '\app\controller\Test::test');
3.9.3路由重定向
# Route::redirect('路由表达式' , '重定向地址' , 状态码);
# 跳转到百度首页
Route::get('test' , 'http://baidu.com');
# 跳转到 <hostname>/test/test http状态码为302
Route::get('test' , '/test/test' , 302);
3.9.4路由闭包
# 路由闭包
Route::get('test' , function(){
return ;
});
# 闭包传递参数
Route::get('test/:id' , function($id){
return 'id : ' . $id;
});
# 依赖注入
Route::get('test/:id' , function(Test $test , $id){
return $test->where('id' , $id)->find;
});
# 用法示例
# 访问后缀必须为html
Route::get('test' , 'test/test')->ext(html);
# 批量设置路由参数
Route::get('test' , 'test/test')->option(['ext' => 'html' , 'https' => true]);
3.9.5url后缀
# ext() 参数
# false => 禁止伪静态访问
# ' ' => 允许所有后缀访问(默认)
# html => 只允许设置伪静态后缀
# html|php => 允许多个伪静态后缀
# 访问路径<hostname>/test.html 或 <hostname>/test.php
Route::get('test' , 'test/test')->ext('html|php');
# 如果ext方法不传值则表示不支持后缀访问
# denyExt() => 和ext相反
# 如果ext方法不传值则表示必须用后缀访问
3.9.6. 路由中间件
# middleware()
Route::get('test' , 'test/test')->middleware(\app\middleware\Auth::class);
# 注册路由全局中间件
# config/route.php 文件内
'middleware' => [
app\middleware\Auth::class,
app\middleware\Check::class,
],
路由中间件可以在路由执行前后添加额外的处理逻辑。在ThinkPHP6中,可以通过以下方式定义路由中间件:
// 定义中间件
Route::get('hello', 'index/hello')->middleware('checkLogin');
3.9.7. 路由分组
# group()
# 访问路径 <hostname>/group/test/
Route::group('group' , function(){
Route::get('test' , 'test/test');
});
# 路由分组 组内路由会继承分分组的属性 例如ext
Route::group('group' , function(){
# test路由后缀必须为html
Route::get('test' , 'test/test');
})->ext('html');
# 路由分组支持嵌套
Route::group(function(){
Route::('shop' , function(){
Route::get('buy' , 'shop/buy');
})
Route::('user' , function(){
Route::get('list' , 'uset/list');
})
})->ext('html');