Laravel中如何结合队列任务与自定义Mailable使用不同密码重置代理
基于多Guard的Admin密码重置实现方案
我需要通过多Guard机制,以admin密码重置代理实现密码重置功能。项目已包含web和admin两个Guard,要以admins作为代理,结合自定义Mailable类ResetPassword,通过队列(Queues)和任务(Jobs)发送密码重置链接邮件。
1. auth.php配置
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'admin' => [ 'driver' => 'session', 'provider' => 'admins', ], ], 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], 'admins' => [ 'driver' => 'eloquent', 'model' => App\Models\Admin::class, ], ], 'passwords' => [ 'users' => [ 'provider' => 'users', 'table' => 'password_resets', 'expire' => 1, 'throttle' => 60, ], 'admins' => [ 'provider' => 'admins', 'table' => 'password_resets', 'expire' => 1, 'throttle' => 60, ], ],
2. ResetPasswordController核心逻辑
public function sendResetLink(SendResetLinkRequest $request) { $adminDetails = Admin::where('email', $request->email)->first(); $email = $request->email; if ($adminDetails) { $token = Str::random(64); DB::table('password_resets')->insert([ 'email' => $email, 'token' => $token, 'created_at' => now(), ]); $link = route('admin.create_new_password', encrypt($token) . '?e=' . base64_encode($email)); dispatch(new ResetPasswordMailJob($adminDetails, $link)); session(['true' => 1]); return back(); } else { return back()->withErrors(['email' => 'The email is invalid']); } }
3. 队列任务类ResetPasswordMailJob
class ResetPasswordMailJob implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; public $details, $link; /** * Create a new job instance. * * @return void */ public function __construct($details, $link) { $this->details = $details; $this->link = $link; } /** * Execute the job. * * @return void */ public function handle() { // Password::broker('admin')->sendResetLink(['email' => $this->details->email], function () { // new ResetPassword($this->details->name, $this->link); // }); Mail::to($this->details->email)->send(new ResetPassword($this->details->name, $this->link)); } }
4. 自定义Mailable类ResetPassword
class ResetPassword extends Mailable { use Queueable, SerializesModels; public $name, $link; /** * Create a new message instance. * * @return void */ public function __construct($name, $link) { $this->name = $name; $this->link = $link; } /** * Build the message. * * @return $this */ public function build() { return $this->subject('Reset Password')->view('emails.reset-password'); } }
内容的提问来源于stack exchange,提问作者AHSEN ALEE
相关产品推荐
相关产品推荐

