Laravel 6登录表单扩展及登录逻辑重写位置咨询
嘿,作为Laravel 6的新手,你遇到的这个问题其实很常见——Laravel UI的登录逻辑默认封装在Trait里,我们只需要重写对应的方法就能自定义啦。我来一步步给你讲清楚怎么做:
第一步:找到登录逻辑的核心位置
Laravel UI生成的登录控制器是 app/Http/Controllers/Auth/LoginController.php,这个控制器继承了 Illuminate\Foundation\Auth\AuthenticatesUsers Trait,所有默认的登录验证、认证逻辑都在这个Trait里。我们不需要修改Trait本身,只需要在LoginController里重写对应的方法即可。
第二步:扩展登录表单
假设你想在登录时让用户选择所属学校,首先需要修改登录视图 resources/views/auth/login.blade.php,在表单中添加学校选择字段:
<div class="form-group row"> <label for="school_id" class="col-md-4 col-form-label text-md-right">{{ __('所属学校') }}</label> <div class="col-md-6"> <select id="school_id" class="form-control @error('school_id') is-invalid @enderror" name="school_id" required> @foreach(\App\School::all() as $school) <option value="{{ $school->id }}">{{ $school->name }}</option> @endforeach </select> @error('school_id') <span class="invalid-feedback" role="alert"> <strong>{{ $message }}</strong> </span> @enderror </div> </div>
第三步:重写登录验证规则
在LoginController里重写 validateLogin 方法,添加自定义的验证规则(比如验证学校ID是否存在):
<?php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\AuthenticatesUsers; use Illuminate\Http\Request; class LoginController extends Controller { use AuthenticatesUsers; // 保留默认的redirectTo等配置... /** * 重写登录验证规则 */ protected function validateLogin(Request $request) { $request->validate([ $this->username() => 'required|string', 'password' => 'required|string', 'school_id' => 'required|exists:school,id', // 验证学校ID是否存在于school表 ]); } // ... 其他方法 }
第四步:自定义认证逻辑
如果需要让系统只允许用户登录自己所属的学校账号,我们需要重写 attemptLogin 方法,把学校ID加入到认证凭证中:
/** * 重写认证逻辑,加入学校ID匹配 */ protected function attemptLogin(Request $request) { // 获取默认的认证凭证(邮箱+密码) $credentials = $this->credentials($request); // 追加学校ID到凭证数组 $credentials['school_id'] = $request->input('school_id'); // 使用包含学校ID的凭证进行认证 return $this->guard()->attempt( $credentials, $request->filled('remember') ); }
或者你也可以直接重写 credentials 方法来整合凭证:
/** * 自定义认证凭证 */ protected function credentials(Request $request) { return array_merge( $request->only($this->username(), 'password'), ['school_id' => $request->school_id] ); }
额外提示:修正你代码里的小问题
我注意到你当前的代码有几个小错误,会影响后续功能:
- 模型类名与表名不匹配:你创建的是
school表,但模型类名写成了Corp,建议改成School;如果要保留Corp类名,需要在模型里指定表名:class Corp extends Model { protected $table = 'school'; // 指定关联的表 public function users() { return $this->hasMany(User::class); } } - 外键关联错误:users表的外键关联到了
corps表,应该是school表才对,修改迁移文件:$table->foreign('school_id') ->references('id') ->on('school') ->onDelete('CASCADE');
内容的提问来源于stack exchange,提问作者CreeKLY
相关产品推荐
相关产品推荐

