Laravel未定义变量username问题求助:登录后无法展示用户名
Laravel Session登录用户名显示问题修复
我查了很多相关方案,还是遇到用户变量未定义的问题。想通过Session实现登录,在dashboard页面显示用户名,相关代码如下:
原MainController代码
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; class MainController extends Controller { function login1(Request $request){ $username = $request->input('username'); $password = $request->input('password'); $data = DB::table('users')->where(['username'=>$username, 'password'=>$password])->get(); if(count($data)>0){ $request->session()->put('username',$data); return redirect('dashboard'); } else{ echo "error"; $notification = array( 'message' => 'User Does not Exists!', 'alert-type' => 'error' ); return back()->with($notification); } }}
原dashboard.blade.php代码
@extends('layouts.theme') @section('content') <style type="text/css"> .form-control { margin-bottom: 10px; } label{ font-size: 13px; font-weight: bold; } .disabled{ background-color: #dddddd; } select.form-control{ padding: 0; cursor: pointer; } table{ font-size: 13px; } .wellcometext{ font-family: sans-serif; font-size: 28px; text-align: center; margin-top: 250px; color: black; } .slogon { font-size: 18px; text-align: center; font-family: sans-serif; color: black; } .wellcometext:hover{ transition: transform .5s; } .modal-backdrop { background-color: black;} </style> <div class="container"> <h4 class="wellcometext"><b>Welcome To The Hospital Information System.</b></h4> <h6 class="slogon">Future Is Integration.</h6><br> <h2 class="wellcometext"><B>{{session('username')}}</b><h2> </div> @endsection
原web.php路由代码
<?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\login; use App\Http\Controllers\MainController; use Illuminate\Http\Request; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/', function () { return view('login'); }); //Route::view('login','login'); Route::view('dashboard','dashboard'); //Route::view('logout','logout'); Route::get('/welcome', function () { return view('welcome'); }); Route::get('/cancelorder', function () { return view('cancelorder'); }); Route::post('add',[login::class, 'add']); Route::get('login1','App\Http\Controllers\MainController@login1'); Route::get('/logout',function(){ if (session()->has('login1')) { session ()->pull('login1',null); } return redirect ('login'); }); Route::get('/login',function(){ if (session()->has('login1')){ return redirect ('dashboard'); } return redirect ('login'); });
错误分析与修复步骤
- Session存储错误:
get()返回的是Laravel集合对象,不是单个用户数据,应改用first()获取单条记录,且仅存储用户名字段而非整个集合。 - 路由逻辑问题:
- 登录接口用GET请求不安全,需改为POST;
dashboard路由直接返回视图,未校验Session,未登录用户可直接访问;- 登出、登录路由的Session判断键为
login1,但实际存储的键是username,逻辑不匹配; /login路由存在循环重定向问题,判断后仍跳转至自身。
- Blade模板输出问题:直接输出
{{session('username')}}未判断Session是否存在,若存储的是集合/对象会导致异常。
修复后的代码
MainController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; class MainController extends Controller { function login1(Request $request){ $username = $request->input('username'); $password = $request->input('password'); // 使用first()获取单个用户记录,而非get()返回的集合 $user = DB::table('users')->where(['username'=>$username, 'password'=>$password])->first(); if($user){ // 仅存储用户名到Session $request->session()->put('username', $user->username); return redirect('dashboard'); } else { $notification = array( 'message' => '用户不存在或密码错误!', 'alert-type' => 'error' ); return back()->with($notification); } } }
web.php(路由)
<?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\login; use App\Http\Controllers\MainController; use Illuminate\Http\Request; Route::get('/', function () { return view('login'); }); // 改为控制器方法访问dashboard,增加Session校验 Route::get('dashboard', function(){ if(!session()->has('username')){ return redirect('/'); } return view('dashboard'); }); Route::get('/welcome', function () { return view('welcome'); }); Route::get('/cancelorder', function () { return view('cancelorder'); }); Route::post('add',[login::class, 'add']); // 登录改为POST请求,提升安全性 Route::post('login1',[MainController::class, 'login1']); Route::get('/logout',function(){ if (session()->has('username')){ session()->pull('username'); } return redirect('/'); }); // 修复循环重定向问题 Route::get('/login',function(){ if (session()->has('username')){ return redirect('dashboard'); } return view('login'); });
dashboard.blade.php
@extends('layouts.theme') @section('content') <style type="text/css"> .form-control { margin-bottom: 10px; } label{ font-size: 13px; font-weight: bold; } .disabled{ background-color: #dddddd; } select.form-control{ padding: 0; cursor: pointer; } table{ font-size: 13px; } .wellcometext{ font-family: sans-serif; font-size: 28px; text-align: center; margin-top: 250px; color: black; } .slogon { font-size: 18px; text-align: center; font-family: sans-serif; color: black; } .wellcometext:hover{ transition: transform .5s; } .modal-backdrop { background-color: black; } </style> <div class="container"> <h4 class="wellcometext"><b>Welcome To The Hospital Information System.</b></h4> <h6 class="slogon">Future Is Integration.</h6><br> <!-- 先判断Session存在性,再输出用户名 --> @if(session()->has('username')) <h2 class="wellcometext"><B>{{ session('username') }}</b></h2> @endif </div> @endsection
额外提示
- 密码安全:禁止明文存储密码,应使用
Hash::make()加密密码,登录时用Hash::check()验证。 - 中间件优化:可使用Laravel自带的
auth中间件简化登录校验,无需手动判断Session。
内容的提问来源于stack exchange,提问作者Anas
相关产品推荐
相关产品推荐

