路由模式
默认路由文件
routes/web.php
该文件定义用于 web 界面的路由。 这些路由被分配给 web 中间件组, 该组提供会话状态和 CSRF 保护等功能
routes/api.php
该文件中的路由是无状态的,这些路由被分配给 api 中间件组。
对于大多数应用程序, 都是以在 routes/web.php 文件定义路由开始的。 可以通过在浏览器中输入定义的路由 URL 来访问 routes/web.php 的路由。例如:
// 引用User控制器
use App\Http\Controllers\UserController;
// 路由
Route::get('/user', [UserController::class, 'index']);
基本路由
最基本的 Laravel 路由接受一个 URI 和一个闭包,它提供了一种非常简单和有表现力的方法来定义路由和行为,而不需要复杂的路由配置文件
// 引用Laravel的底层路由
use Illuminate\Support\Facades\Route;
// 基本路由
Route::get('/greeting', function () {
return 'Hello World';
});
可用的路由器方法
路由器允许你注册能响应任何 HTTP 请求的路由:
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
有的时候你可能需要注册一个可响应多个 HTTP 请求的路由,这时你可以使用 match 方法,也可以使用 any 方法注册一个实现响应所有 HTTP 请求的路由:
Route::match(['get', 'post'], '/', function () {
//
});
Route::any('/', function () {
//
});
CSRF 保护
指向 web 路由文件中定义的 POST
、PUT
或 DELETE
路由的任何 HTML 表单都应该包含一个 CSRF 令牌字段,否则,这个请求将会被拒绝。
<form method="POST" action="/profile">
@csrf
...
</form>
重定向路由
如果要定义重定向到另一个 URI 的路由,可以使用 Route::redirect
方法。
routes/web.php
<?php
// 引用User控制器
use App\Http\Controllers\IndexController;
// 引用Laravel的底层路由
use Illuminate\Support\Facades\Route;
// 定义首页路由
Route::get('/',[IndexController::class,'index']);
// 定义user路由
Route::get('/user',[IndexController::class,'user']);
/**
* 重定向
* 第一个参数 => 从哪个路由开始重定向
* 第二个参数 => 重定向哪个路由
* 第三个参数 => 状态码 默认302
*/
Route::redirect('/','/user',301);
视图路由
如果你的路由只需要返回一个视图,可以使用 Route::view
方法。它和 redirect
一样方便,不需要定义完整的路由或控制器。
view 方法有三个参数,其中前两个是必填参数,分别是 URI 和视图名称。第三个参数选填,可以传入一个数组,数组中的数据会被传递给视图:
// 返回视图
Route::view('/','welcome');
// 返回视图并且返回数据
Route::view('/','welcome',['User' => $data]);
路由参数
必填参数
有时您将需要捕获路由内的 URI 段。例如,您可能需要从 URL 中捕获用户的 ID。您可以通过定义路由参数来做到这一点:
// 引用Laravel的底层路由
use Illuminate\Support\Facades\Route;
Route::get('/user/{id}',function($id){
return 'User '.$id;
});
也可以根据您的需要在路由中定义多个参数:
Route::get('/posts/{post}/comments/{comment}', function ($postId, $commentId) {
//
});
可选参数
有时,你可能需要指定一个路由参数,但你希望这个参数是可选的。你可以在参数后面加上 ? 标记来实现,但前提是要确保路由的相应变量有默认值:
Route::get('/user/{name?}', function ($name = null) {
return $name;
});
Route::get('/user/{name?}', function ($name = 'John') {
return $name;
});
路由的参数通常都会被放在 {}
,并且参数名只能为字母。 下划线 (_)
也可以用于路由参数名中。路由参数会按路由定义的顺序依次注入到路由回调或者控制器中 -
,而不受回调或者控制器的参数名称的影响
正则表达式约束
你可以使用路由实例上的 where 方法约束路由参数的格式。where 方法接受参数名称和定义参数应如何约束的正则表达式
Route::get('/user/{name}', function ($name) {
//
})->where('name', '[A-Za-z]+');
Route::get('/user/{id}', function ($id) {
//
})->where('id', '[0-9]+');
Route::get('/user/{id}/{name}', function ($id, $name) {
//
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);
路由命名
路由命名可以方便地为指定路由生成URL或者重定向。通过在路由定义上链式调用 name
方法可以指定路由名称:
Route::get('/user/profile',function(){
// 代码
})->name('profile');
你还可以指定控制器行为的路由名称:
Route::get(
'/user/profile',
[UserProfileController::class, 'show']
)->name('profile');
注意:路由命名必须是唯一的
生成指定路由的URL
一旦为路由指定了名称,你可以在生成 url
或者通过 Laravel
的 route
和 redirect
辅助函数重定向时使用路由的名字
// 生成链接...
$url = route('profile');
// 生成重定向...
return redirect()->route('profile');
路由组 && 中间件
路由组允许你共享路由属性,例如中间件,这样不需要在每个单独的路由上定义那些属性
想把 中间件 分配给组内所有的路由,你可以在定义组之前使用 middleware 方法。中间件将按照它们在数组中列出的顺序执行:
// 路由前缀+路由组
Route::prefix('/user')->group(function(){
Route::get('/user',[IndexController::class,'user']);
});
// 中间件+路由组
Route::middleware(['first', 'second'])->group(function () {
Route::get('/', function () {
// 使用 first 和 second 中间件...
});
Route::get('/user/profile', function () {
// 使用 first 和 second 中间件...
});
});