You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 04:10:28