laravel使用模型观察者调用队列发送邮件

问题描述

场景需求:用户注册完毕之后自动发送一封欢迎邮件给用户.

问题出现的环境背景及现有代码

考虑到邮件发送压力问题,因此使用队列发送邮件,目前的实现逻辑是,建立观察者对User模型进行观察.
UserOberver文件代码如下:

<?php

namespace App\Observers;

use App\Mail\Welcome;
use App\User;
use Illuminate\Support\Facades\Mail;

class UserObserver
{
    //当用户注册后调用welcome邮件类发送欢迎邮件.
    public function created(User $user)
    {
        Mail::to($user)->send(new Welcome($user->name));
    }
    
}

建立了welcome邮件类,代码如下:

<?php

namespace App\Mail;

use App\User;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class Welcome extends Mailable
{
    use Queueable, SerializesModels;   

        public $name;
        
    public function __construct($name)
    {
        $this->name=$name;
    }

   
    public function build()
    {
        //使用邮件模板welcome向用户发送邮件,为了方便演示,请暂时忽略主题变量为`name`的事情.
        return $this->view('mail.welcome')->subject($this->name);
    }
}

现状

目前观察者是没有使用队列发送邮件的,根据laravel 5.8文档,可以使用queue将邮件加入队列.
官网文档及示例代码如下:

https://learnku.com/docs/lara...

将邮件消息加入队列

由于发送邮件消息可能大幅度延长应用的响应时间,许多开发者选择将邮件消息加入队列放在后台发送。Laravel 使用内置的 统一队列 API 简化了这一工作。若要将邮件消息加入队列,可以在制定消息的接收者后,使用 Mail facadequeue 方法:

Mail::to($request->user())
    ->cc($moreUsers)
    ->bcc($evenMoreUsers)
    ->queue(new OrderShipped($order));
此方法自动将作业推送到队列中以便消息在后台发送。使用此特性之前,需要 配置队列

想实现的效果及疑难

  • 使用队列发送邮件

目前我项目里面有两个队列文件CreateFileSendEmail在使用CreateFile队列时我是讲逻辑写入了其的handle方法中实现,例如

    public function handle()
    {
        Log::alert('redis 队列测试');
    }
  • 面临的问题
    1.之前是将业务逻辑写到了队列文件的handle()方法中,而我的项目目前的逻辑已经写入了welcome中,如果是按文档所说使用queue调用队列,我的队列文件SendEmail的handle()应该如何写?

    2.另外queue视乎并无参数可用,我如何实现将发送邮件推送到哪个队列呢?

阅读 2k
1 个回答

就在你贴的链接下面一点儿,你是真的没看到么。。。

clipboard.png

推荐问题