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
相关产品推荐
相关产品推荐

