Laravel 9 Nwidart模块中如何实现独立登录注册功能?
为nWidart Laravel模块实现独立登录注册(Laravel 9)
1. 创建模块专属用户模型与数据库迁移
首先生成Agent模块的用户模型和对应的迁移文件:
php artisan module:make-model AgentUser Agent
打开模块迁移文件(Modules/Agent/Database/Migrations/xxxx_xx_xx_create_agent_users_table.php),补充用户表字段:
public function up() { Schema::create('agent_users', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); $table->rememberToken(); $table->timestamps(); }); }
执行模块迁移:
php artisan module:migrate Agent
2. 在根配置中添加专属认证Guard与Provider
打开项目根目录的config/auth.php,在guards数组里添加Agent专属Guard:
'guards' => [ // ... 原有配置 'agent' => [ 'driver' => 'session', 'provider' => 'agents', ], ],
接着在providers数组里添加对应的数据提供者:
'providers' => [ // ... 原有配置 'agents' => [ 'driver' => 'eloquent', 'model' => Modules\Agent\Models\AgentUser::class, ], ],
3. 编写模块内的认证控制器
生成登录与注册控制器:
php artisan module:make-controller Auth/AgentLoginController Agent php artisan module:make-controller Auth/AgentRegisterController Agent
登录控制器逻辑(Modules/Agent/Http/Controllers/Auth/AgentLoginController.php)
namespace Modules\Agent\Http\Controllers\Auth; use Illuminate\Http\Request; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Auth; class AgentLoginController extends Controller { public function showLoginForm() { return view('agent::auth.login'); } public function login(Request $request) { $request->validate([ 'email' => 'required|email', 'password' => 'required|string', ]); if (Auth::guard('agent')->attempt($request->only('email', 'password'), $request->filled('remember'))) { $request->session()->regenerate(); return redirect()->intended(route('agent.dashboard')); } return back()->withErrors([ 'email' => '邮箱或密码错误,请重新输入', ])->onlyInput('email'); } public function logout(Request $request) { Auth::guard('agent')->logout(); $request->session()->invalidate(); $request->session()->regenerateToken(); return redirect('/agent/login'); } }
注册控制器逻辑(Modules/Agent/Http/Controllers/Auth/AgentRegisterController.php)
namespace Modules\Agent\Http\Controllers\Auth; use Illuminate\Http\Request; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Hash; use Modules\Agent\Models\AgentUser; class AgentRegisterController extends Controller { public function showRegistrationForm() { return view('agent::auth.register'); } public function store(Request $request) { $validated = $request->validate([ 'name' => 'required|string|max:255', 'email' => 'required|string|email|max:255|unique:agent_users', 'password' => 'required|string|min:8|confirmed', ]); $user = AgentUser::create([ 'name' => $validated['name'], 'email' => $validated['email'], 'password' => Hash::make($validated['password']), ]); Auth::guard('agent')->login($user); return redirect()->route('agent.dashboard'); } }
4. 配置模块专属路由
打开Modules/Agent/Routes/web.php,添加认证与面板路由:
use Illuminate\Support\Facades\Route; use Modules\Agent\Http\Controllers\Auth\AgentLoginController; use Modules\Agent\Http\Controllers\Auth\AgentRegisterController; use Modules\Agent\Http\Controllers\AgentDashboardController; // 认证路由 Route::get('/agent/login', [AgentLoginController::class, 'showLoginForm'])->name('agent.login'); Route::post('/agent/login', [AgentLoginController::class, 'login']); Route::post('/agent/logout', [AgentLoginController::class, 'logout'])->name('agent.logout'); Route::get('/agent/register', [AgentRegisterController::class, 'showRegistrationForm'])->name('agent.register'); Route::post('/agent/register', [AgentRegisterController::class, 'store']); // Agent专属面板(需认证) Route::middleware('auth:agent')->group(function () { Route::get('/agent/dashboard', [AgentDashboardController::class, 'index'])->name('agent.dashboard'); });
5. 创建认证与面板视图
在Modules/Agent/Resources/Views/下创建对应视图:
auth/login.blade.php:编写登录表单auth/register.blade.php:编写注册表单dashboard.blade.php:Agent专属面板页面
示例登录表单片段:
<form method="POST" action="{{ route('agent.login') }}"> @csrf <div> <label for="email">邮箱</label> <input id="email" type="email" name="email" value="{{ old('email') }}" required autofocus> @error('email') <span>{{ $message }}</span> @enderror </div> <div> <label for="password">密码</label> <input id="password" type="password" name="password" required> @error('password') <span>{{ $message }}</span> @enderror </div> <div> <input type="checkbox" name="remember" id="remember"> <label for="remember">记住我</label> </div> <div> <button type="submit">登录</button> </div> </form>
内容的提问来源于stack exchange,提问作者Brijesh Chauhan
相关产品推荐
相关产品推荐

