首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

Laravel 註冊功能重構實戰:從路由到中間件的完整遷移指南

     編輯:PHP 綜合知識

項目背景與需求分析

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('/');
}

第四步:中間件實現權限分層

1. 全局登錄檢查中間件

// 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 實現全局攔截。

2. 超管權限專用中間件

// 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')

通過中間件將權限邏輯從控制器剝離,實現了「單一職責、復用靈活、維護簡單」的架構目標。這套模式同樣適用於文章發布、後台管理等多權限場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved