Laravel 內建的註冊功能基於郵箱驗證,但實際項目常需:用戶名註冊、超管專屬創建賬號、自定義表單字段(如用戶組)、註冊後自動登錄。本文演示如何從零重構一套符合實戰需求的註冊系統。
// routes/web.php
Route::get('register', 'UserController@getRegister')->middleware('user.group');
Route::post('register', 'UserController@postRegister')->middleware('user.group');
使用 php artisan make:controller UserController 生成控制器,採用 GET 顯示頁面、POST 處理提交的 RESTful 風格。
// UserController.php
public function getRegister() {
return view('auth.register');
}
Blade 模板關鍵點:
{!! csrf_field() !!} 防 CSRF 攻擊@if(count($errors) > 0) 統一錯誤展示區塊name="password_confirmation" 配合 confirmed 驗證規則select name="group" 實現用戶組下拉選擇public function postRegister(Request $request) {
// 1. 驗證規則定義
$rules = [
'username' => 'required|unique:finance_enewsuser',
'password' => 'required|between:6,20|confirmed',
];
$messages = [
'required' => ':attribute不能為空',
'unique' => '用戶名已被註冊',
'between' => '密碼必須是6~20位之間',
'confirmed'=> '新密碼和確認密碼不匹配',
];
// 2. 執行驗證
$validator = Validator::make($request->all(), $rules, $messages);
if ($validator->fails()) {
return back()->withErrors($validator);
}
// 3. 構建用戶數據(密碼加密、默認字段)
$data = [
'username' => $request->input('username'),
'password' => bcrypt($request->input('password')),
'groupid' => $request->input('group'),
'checked' => 0,
'styleid' => 1,
// ... 其他默認字段
'lasttime' => time(),
'lastip' => '127.0.0.1',
];
// 4. 入庫並可選自動登錄
$user = User::create($data);
// Auth::login($user); // 如需註冊即登錄取消註釋
return redirect('/');
}
// app/Http/Middleware/CheckLoginMiddleware.php
public function handle($request, Closure $next) {
$response = $next($request); // 先執行後續請求
if (!Auth::check() && !$request->is('login')) {
return redirect('/login');
}
return $response;
}
註冊:在 Kernel.php 的 $middleware 陣列加入 \App\Http\Middleware\CheckLoginMiddleware::class 實現全局攔截。
// app/Http/Middleware/CheckGroupMiddleware.php
public function handle($request, Closure $next) {
if (Auth::user()->groupid != 1) {
return redirect('/'); // 非超管導向首頁
}
return $next($request);
}
註冊別名:在 $routeMiddleware 加入 'user.group' => \App\Http\Middleware\CheckGroupMiddleware::class。
應用方式:路由鏈式 ->middleware('user.group') 或控制器構造函數 $this->middleware('user.group')。
class MyController extends Controller {
public function __construct() {
$this->middleware('user.group'); // 該控制器所有方法自動受保護
}
}
| 場景 | 推薦方案 |
|---|---|
| 全站登錄檢查 | 全局中間件 + 排除登錄頁避免死循環 |
| 特定權限頁面 | 路由中間件別名 + 選擇性掛載 |
| 控制器整體保護 | 構造函數注入中間件 |
| 驗證錯誤定位 | $errors->has('field') + $errors->first('field') |
通過中間件將權限邏輯從控制器剝離,實現了「單一職責、復用靈活、維護簡單」的架構目標。這套模式同樣適用於文章發布、後台管理等多權限場景。