基础路由
Laravel 最基础的路由由 URI 和闭包组成。
无需复杂的配置文件即可轻松定义路由与对应行为。
use Illuminate\Support\Facades\Route;
Route::get('/greeting', function () {
return 'Hello World';
});
默认的路由文件
Laravel 所有的路由都定义在 routes/ 目录下的路由文件中。
Laravel 会根据 bootstrap/app.php 的配置自动加载这些文件。
routes/web.php 用于定义面向浏览器的路由。
此文件的路由会应用 web 中间件组,从而提供 Session、CSRF 保护与 Cookie 加密。
use App\Http\Controllers\UserController;
Route::get('/user', [UserController::class, 'index']);
API 路由
如果应用要提供无状态 API,可以通过 install:api Artisan 命令启用 API 路由。
install:api 命令会安装 Laravel Sanctum 并创建 routes/api.php 文件。
Sanctum 提供了一种简洁而稳固的 API 令牌认证守卫,适用于第三方 API 消费者、SPA 和移动应用。
Route::get('/user', function (Request $request) {
return $request->user();
})->middleware('auth:sanctum');
routes/api.php 中的路由是无状态的,并会应用 api 中间件组。
同时会自动为所有路由添加 /api 前缀,无需手动指定。
如果要修改前缀,请编辑应用的 bootstrap/app.php 文件。
->withRouting(
api: __DIR__.'/../routes/api.php',
apiPrefix: 'api/admin',
// ...
)
可用的 HTTP 方法
路由器可以注册对应任意 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。
Route::match(['get', 'post'], '/', function () {
// ...
});
Route::any('/', function () {
// ...
});
在 web 路由文件中接收 POST、PUT、PATCH、DELETE 的 HTML 表单,务必包含 @csrf 指令。
否则请求将被拒绝。
返回视图的路由
如果路由只需返回视图,可以用 Route::view 更简洁地定义。
Route::view('/welcome', 'welcome');
// 向视图传递数据
Route::view('/welcome', 'welcome', ['name' => 'Taylor']);
路由参数
必需参数
如果要动态获取 URL 的一部分,请使用路由参数。
参数用 {} 包裹,并作为路由回调的参数接收。
Route::get('/user/{id}', function (string $id) {
return '用户 ID: ' . $id;
});
可以定义多个参数。
Route::get('/posts/{post}/comments/{comment}', function (string $postId, string $commentId) {
return "文章 {$postId} 的评论 {$commentId}";
});
可选参数
若要让参数变为可选,请在参数名末尾添加 ?,并给对应参数设置默认值。
Route::get('/user/{name?}', function (?string $name = null) {
return $name ?? '访客';
});
Route::get('/user/{name?}', function (?string $name = '访客') {
return $name;
});
正则表达式约束参数
使用 where 方法可以用正则表达式约束参数的格式。
Route::get('/user/{id}', function (string $id) {
// ...
})->where('id', '[0-9]+');
Route::get('/user/{name}', function (string $name) {
// ...
})->where('name', '[a-zA-Z]+');
常用模式还可以通过便捷方法书写。
Route::get('/user/{id}/{name}', function (string $id, string $name) {
// ...
})->whereNumber('id')->whereAlpha('name');
命名路由
命名路由可以在生成 URL 或重定向时通过路由名进行引用。
Route::get('/user/profile', function () {
// ...
})->name('profile');
通过命名路由生成 URL
使用 route 辅助函数可以根据路由名生成 URL。
// 生成 URL
$url = route('profile');
// 生成带参数的 URL
$url = route('user.show', ['id' => 1]);
重定向
return redirect()->route('profile');
路由分组
可以将相关路由分组,共享中间件、控制器、前缀等设置。
中间件
Route::middleware(['auth'])->group(function () {
Route::get('/dashboard', function () {
// 仅已认证用户可访问
});
Route::get('/account', function () {
// 仅已认证用户可访问
});
});
控制器
可以将使用同一个控制器的路由分组。
use App\Http\Controllers\OrderController;
Route::controller(OrderController::class)->group(function () {
Route::get('/orders', 'index');
Route::post('/orders', 'store');
Route::get('/orders/{id}', 'show');
});
可以为路由 URI 添加公共前缀。
Route::prefix('admin')->group(function () {
Route::get('/users', function () {
// 可通过 /admin/users 访问
});
Route::get('/posts', function () {
// 可通过 /admin/posts 访问
});
});
查看路由列表
要列出所有已定义的路由,请使用 Artisan 命令。
若要一并显示中间件信息,可以:
php artisan route:list -v
若只显示以特定 URI 开头的路由,可以:
php artisan route:list --path=user
下一步