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

Laravel中点击导航链接时如何设置及获取Session值?

解决方案

1. 点击链接时设置Session值

步骤1:修改导航链接

把下拉菜单里的链接改为指向专门的验证入口路由,传递表单类型参数:

@if (Route::has('register'))
    <li class="nav-item dropdown">
        <a id="register" class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
            Register
        </a>
        <ul class="dropdown-menu dropdown-menu-end" aria-labelledby="register">
            <li><a class="dropdown-item" href="{{ route('auth.verify', ['type' => 'training']) }}">Training</a></li>
            <li><a class="dropdown-item" href="{{ route('auth.verify', ['type' => 'shopping']) }}">Shopping</a></li>
            <li><a class="dropdown-item" href="{{ route('auth.verify', ['type' => 'service']) }}">Service</a></li>
            <li><a class="dropdown-item" href="{{ route('auth.verify', ['type' => 'counseling']) }}">Counseling</a></li>
        </ul>
    </li>
@endif

步骤2:添加路由配置

在web.php中新增验证入口、提交路由,同时调整表单路由的中间件:

// 验证码验证入口
Route::get('/auth/verify', [App\Http\Controllers\Auth\VerificationController::class, 'showVerifyForm'])->name('auth.verify');
// 验证码提交验证
Route::post('/auth/verify', [App\Http\Controllers\Auth\VerificationController::class, 'verify'])->name('auth.verify.submit');

// 验证通过后才能访问的表单路由组
Route::middleware('verified.user')->group(function () {
    Route::get('/training', [App\Http\Controllers\Auth\RegisterController::class, 'training'])->name('training');
    Route::post('/training/store', [App\Http\Controllers\Auth\RegisterController::class, 'trainingStore'])->name('training.store');
    
    Route::get('/shopping', [App\Http\Controllers\Auth\RegisterController::class, 'shopping'])->name('shopping');
    Route::post('/shopping/store', [App\Http\Controllers\Auth\RegisterController::class, 'shoppingStore'])->name('shopping.store');
    
    // 补充service、counseling的路由
});

步骤3:创建验证控制器处理Session

新建app/Http/Controllers/Auth/VerificationController.php,负责设置Session和验证码验证逻辑:

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class VerificationController extends Controller
{
    public function showVerifyForm(Request $request)
    {
        $validTypes = ['training', 'shopping', 'service', 'counseling'];
        $type = $request->query('type');

        if (!in_array($type, $validTypes)) {
            abort(404);
        }

        // 记录用户要访问的表单类型到Session
        $request->session()->put('target_form', $type);

        // 返回验证码输入页面
        return view('auth.verify');
    }

    public function verify(Request $request)
    {
        // 验证手机号和验证码格式
        $request->validate([
            'phone' => 'required|numeric',
            'code' => 'required|numeric',
        ]);

        // 这里补充实际的验证码校验逻辑(比如比对缓存/数据库中的验证码)
        // 校验通过后标记验证状态
        $request->session()->put('verified', true);
        
        // 跳转到目标表单页面
        return redirect()->route($request->session()->get('target_form'));
    }
}

步骤4:替换原有中间件

原有的Training.php、Shopping.php中间件逻辑错误,新建通用中间件VerifiedUser.php:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class VerifiedUser
{
    public function handle(Request $request, Closure $next)
    {
        // 检查是否完成验证码验证
        if (!$request->session()->has('verified') || !$request->session()->has('target_form')) {
            // 未验证则跳转回验证页面,携带当前表单类型
            return redirect()->route('auth.verify', ['type' => $request->route()->getName()]);
        }

        return $next($request);
    }
}

在app/Http/Kernel.php的$routeMiddleware中注册该中间件:

protected $routeMiddleware = [
    // ...其他中间件
    'verified.user' => \App\Http\Middleware\VerifiedUser::class,
];

2. 在training.blade.php中获取Session值

有三种常用方式获取Session值:

方式1:使用session()助手函数

{{-- 获取目标表单类型 --}}
<p>当前表单类型:{{ session('target_form') }}</p>

{{-- 判断Session是否存在某个值 --}}
@if(session()->has('verified'))
    <span>已完成验证码验证</span>
@endif

方式2:通过request()实例获取

<p>当前表单类型:{{ request()->session()->get('target_form') }}</p>

方式3:使用@session指令(Laravel 8+支持)

@session('target_form')
    <p>当前表单类型:{{ $value }}</p>
@endsession

内容的提问来源于stack exchange,提问作者Mahmoud Khosravi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:45:36