Laravel中如何实现支持回退的入学步骤访问控制中间件?
Laravel 入学申请步骤的中间件管控实现方案
1. 创建步骤校验中间件
首先生成专门管控申请步骤的中间件:
php artisan make:middleware CheckAdmissionStep
打开生成的app/Http/Middleware/CheckAdmissionStep.php,编写校验逻辑:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; class CheckAdmissionStep { public function handle(Request $request, Closure $next, $requiredStep) { $user = Auth::user(); // 从用户关联的申请记录中获取已完成的最大步骤(需提前在模型或数据库中定义该字段) $completedStep = $user->admission?->completed_step ?? 0; $currentStep = (int)$requiredStep; // 验证当前访问的申请ID是否属于登录用户,防止越权 if ((int)$request->route('id') !== $user->id) { abort(403, '无权访问该页面'); } // 未完成任何步骤时,仅允许访问步骤1 if ($completedStep === 0) { if ($currentStep !== 1) { return redirect()->route('step1', ['id' => $user->id])->with('error', '请先完成第一步申请'); } } else { // 禁止跳过步骤访问后续页面 if ($currentStep > $completedStep + 1) { return redirect()->route("step{$completedStep}", ['id' => $user->id])->with('error', '请按顺序完成申请步骤'); } } return $next($request); } }
2. 注册中间件
在app/Http/Kernel.php的$routeMiddleware数组中添加中间件别名:
protected $routeMiddleware = [ // ... 其他已存在的中间件 'checkAdmissionStep' => \App\Http\Middleware\CheckAdmissionStep::class, ];
3. 更新路由配置
给每个步骤的GET路由添加步骤校验中间件,并传入对应步骤编号:
// 入学申请步骤路由 // STEP 1 Route::get('/step1/{id}',[CustomAuthController::class, 'step1'])->middleware(['isLoggedIn', 'checkAdmissionStep:1']); Route::post('/step1-register',[CustomAuthController::class, 'step1Register'])->name('step1-register')->middleware('isLoggedIn'); // STEP 2 Route::get('/step2/{id}',[CustomAuthController::class, 'step2'])->middleware(['isLoggedIn', 'checkAdmissionStep:2']); Route::post('/step2-register',[CustomAuthController::class, 'step2Register'])->name('step2-register')->middleware('isLoggedIn'); // STEP 3 Route::get('/step3/{id}',[CustomAuthController::class, 'step3'])->middleware(['isLoggedIn', 'checkAdmissionStep:3']); Route::post('/step3-register',[CustomAuthController::class, 'step3Register'])->name('step3-register')->middleware('isLoggedIn'); // 步骤4至12按照上述格式配置,GET路由添加checkAdmissionStep:N中间件
4. 同步申请进度
在每个步骤的提交方法中,完成数据保存后更新用户的申请进度:
// 以步骤1的提交方法为例 public function step1Register(Request $request) { // 数据验证与保存逻辑... // 更新用户已完成的申请步骤为1 $user = Auth::user(); // 若使用单独的申请记录表 $user->admission()->updateOrCreate(['user_id' => $user->id], ['completed_step' => 1]); // 若直接存在users表字段,可改为: // $user->update(['completed_admission_step' => 1]); return redirect()->route('step2', ['id' => $user->id]); }
步骤2、3及后续步骤的提交方法同理,完成后将completed_step更新为对应步骤编号。
内容的提问来源于stack exchange,提问作者CaptainCRAZY
相关产品推荐
相关产品推荐

