You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 07:57:56