路由模式

默认路由文件

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 路由文件中定义的 POSTPUTDELETE 路由的任何 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 或者通过 Laravelrouteredirect 辅助函数重定向时使用路由的名字

// 生成链接...
$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 中间件...
    });
});
powered by GitbookEdit Time: 2023-04-08 10:28:32