Laravel 路由系统详解
在 Laravel 框架中,路由定义了应用程序的端点,处理用户的 HTTP 请求并返回响应。路由配置文件通常位于 routes/web.php。
基本路由定义
最基础的路由使用 HTTP 方法(如 get, post)和闭包函数定义。
Route::get('/greeting', function () {
return '欢迎访问!';
});
Route::post('/submit', function () {
return '数据已提交';
});
Route::any('/universal', function () {
return '处理任何 HTTP 方法';
});
控制器方法路由 可以将请求直接路由到控制器类的方法。
use App\Http\Controllers\UserController;
Route::get('/profile', [UserController::class, 'displayProfile']);
路由参数 路由可以包含必需或可选参数,这些参数将传递给处理闭包或控制器方法。
// 必需参数
Route::get('/employee/{id}', function ($employeeId) {
return '员工 ID: ' . $employeeId;
});
// 可选参数
Route::get('/customer/{name?}', function ($customerName = '访客') {
return '您好, ' . $customerName;
});
路由参数约束 可以为路由参数添加验证规则,确保参数格式符合预期。
// 使用正则表达式约束
Route::get('/product/{code}', function ($productCode) {
//
})->where('code', '[A-Z]{2}[0-9]{4}');
// 使用约束辅助方法
Route::get('/order/{number}', function ($orderNumber) {
//
})->whereNumber('number');
Route::get('/category/{slug}', function ($categorySlug) {
//
})->whereAlpha('slug');
Route::get('/document/{uuid}', function ($documentUuid) {
//
})->whereUuid('uuid');
Route::get('/status/{state}', function ($state) {
//
})->whereIn('state', ['active', 'pending', 'archived']);
命名路由 为路由指定名称便于在应用程序其他部分引用。
Route::get('/articles/{slug}', [ArticleController::class, 'show'])->name('articles.detail');
路由分组 将具有共同特征的路由分组,便于应用中间件、前缀等共享属性。
// 应用中间件分组
Route::middleware(['auth', 'verified'])->group(function () {
Route::get('/settings', function () {
return '设置页面';
});
Route::get('/notifications', function () {
return '通知中心';
});
});
// 应用路径前缀分组
Route::prefix('admin')->group(function () {
Route::get('/panel', function () {
// 处理路径 /admin/panel
});
Route::get('/reports', function () {
// 处理路径 /admin/reports
});
});
子域名路由 可以为不同的子域名定义路由规则。
Route::domain('api.application.com')->group(function () {
Route::get('/status', function () {
return 'API 服务运行正常';
});
});
// 参数化子域名
Route::domain('{team}.application.com')->group(function () {
Route::get('/projects', function ($team) {
return $team . ' 团队的项目列表';
});
});
回退路由 当没有任何路由匹配请求时,将执行回退路由。
Route::fallback(function () {
return response()->json(['error' => '未找到请求的资源'], 404);
});
签名路由 签名路由用于生成具有安全签名的 URL,常用于密码重置、邀请等场景。
// 定义签名路由
Route::get('/verify/{token}/{action}', VerificationController::class, 'process')->name('verification.link');
// 生成签名 URL
$secureUrl = URL::signedRoute('verification.link', ['token' => $token, 'action' => 'confirm']);
// 生成临时签名 URL(带过期时间)
$temporaryUrl = URL::temporarySignedRoute('verification.link', now()->addMinutes(30), ['token' => $token, 'action' => 'confirm']);
VerificationController.php 示例
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Exceptions\InvalidSignatureException;
class VerificationController extends Controller
{
public function process(Request $request, $token, $action)
{
if (!$request->hasValidSignature()) {
throw new InvalidSignatureException;
}
// 验证逻辑
return "验证令牌: {$token}, 执行操作: {$action}";
}
}