在网站上创建帐户后,我想向用户发送邮件,并且我希望使用队列发送邮件。我正在使用PHP Laravel框架。
我的控制器在点击“创建帐户”后处理了请求:
class LoginController extends Controller
{
...
public function register(Request $request) {
...
$mail = (new RegisterRequest($user))->onConnection("database")->onQueue("emailsQueue");
Mail::queue($mail);
...
}
}
然后我有了这个RegisterRequest(可邮寄)类:
class RegisterRequest extends Mailable
{
use Queueable, SerializesModels;
protected $user;
public function __construct($user)
{
$this->user = $user;
}
public function build()
{
return $this->from('user@example.com')
->to($this->user->email)
->subject("Confirm your Email Address")
->view('emails.register.request')
->with("registration_token", $this->user->registration_token);
}
}
如您所见,我正在使用关系数据库来存储作业。实际上,在调用LoginController的register方法之后,会将作业保存到数据库。但是无法处理。我也开始了php artisan queue:work
,但是数据库中的作业什么也没做。有帮助吗?
编辑:
因此,我刚刚发现从队列中选择作业是通过SQL选择“默认”队列名称完成的。但是我正在将邮件发送到队列“ emailsQueue”。因此,我现在正在像这样运行队列工作器:php artisan queue:work --queue=emailsQueue
,目前一切正常。但是,如何从数据库的每个队列中选择作业?这可能不是最佳尝试,对吧?命名队列没有任何意义,对吧?但是,假设我有一个队列用于处理注册帐户请求,另一个队列用于更改密码请求,依此类推……因此,我认为处理每个队列确实有意义。那我该怎么做呢?可以这样列出队列来完成吗?
php artisan queue:work --queue=registerAccountEmailQueue,changePasswordEmailQueue...
运行php artisan queue:work
到底能做什么?我认为这是运行所有队列的命令。
答案 0 :(得分:0)
使用队列驱动程序数据库。
您应该在控制器中编写
$this->dispatch(new SendNotifyMail($data));
这会将您的$data
传递到队列中。这里 SendNotifyMail 用作作业类别。因此,您还应该像use App\Jobs\SendNotifyMail;
这样在Controller中使用它。
然后在“文件夹作业”中创建一个名为 SendNotifyMail
的文件 <?php
namespace App\Jobs;
use App\Jobs\Job;
use DB;
use Mail;
use Artisan;
use Illuminate\Contracts\Mail\Mailer;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class SendNotifyMail extends Job implements ShouldQueue
{
use InteractsWithQueue, SerializesModels;
public $timeout = 300; // default is 60sec. You may overwrite like this
protected $data;
public function __construct($data)
{
$this->data = $data;
}
public function handle(Mailer $mailer)
{
$data = $this->data; // retrieve your passed data to variable
// your mail code here
}
}
在您的命令中,您需要编写
php artisan queue:listen
或
php artisan queue:work
然后执行代码。