Chào tất cả mọi người, hôm nay là một bài viết để chạy KPI forum và trên hết là giải pháp để thông báo thu hồi nợ teambuilding mà không phải đi nhắc từng người một =)))
- Đầu tiên chúng ta phải đặt câu hỏi "Queue Job" là gì ? và tại sao lại cần đến nó nhỉ ? Trước đây vẫn send mail bình thường mà có cần gì queue đâu nhỉ ?
- Để giải thích một cách đơn giản dễ hiểu thì:
- "Queue Job" là một hàng đợi chứa các tác vụ cần xử lý, tác vụ nào đưa vào trước sẽ được xử lý trước, tác vụ nào đưa vào sau sẽ được xử lý sau. Và quan trọng nhất là Queue trong Laravel có thể chạy ngầm.
- Tại sao cần đến nó ? Lúc xưa chúng ta send mail cho một người cụ thể nào đó. OK, nó chỉ mất tầm 1s để thực hiện xong và chạy các yêu cầu tiếp theo. Thử tưởng tưởng giờ cuộc chiến "Team building" của chúng ta có đến hàng nghìn con nợ và chúng ta phải gửi mail đến cho tất cả các con nợ đó kiểu "Anh Hà đóng tiền đê", "Anh Tiến thiếu 20k nhé", ... send 1mail/1s thì chả nhẽ chúng ta lại ngồi nhìn cái màn hình cả tiếng đồng hồ cho nó gửi xong đống mail rồi mới thao tác tiếp được với máy cũng mình nhỉ. Sẽ thật khó chịu đúng không và queue job sinh ra để giải quyết những vấn đề kiểu vậy. Đơn giản là việc gì tốn nhiều thời gian thực thi thì mình cho nó hàng đợi chạy ngầm còn lại mình lại tiếp tục làm việc của mình ^^
- Đọc xong cái trên chắc câu này chúng ta cũng tự trả lời được rồi nhỉ =))
Vào vấn đề chính là các bước để tạo một queue send mail:
B1: Config file env:
B2: Tạo Mailable (Đoạn này dài em không biết chụp nên em xin phép cop txt cho ae ạ 🙁(( )
*********
<?php
namespace Cms\Modules\Admin\Mails;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class MailNotify extends Mailable
{
use Queueable, SerializesModels;
public $data;
/**
* Create a new data instance.
*
* @return void
*/
public function __construct($data)
{
$this->data = $data;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->from('dohd2201@gmail.com')
->view('Admin::mail.notify')
->subject('Notification email');
}
}
B3: Tạo Job SendMail:
- Tạo folder Jobs
- Trong folder Jobs tạo class SendEmail.php
(Đoạn này cũng hơi dài nên em lại cop txt ạ)
*******
<?php
namespace Cms\Modules\Admin\Jobs;
use Mail;
use Cms\Modules\Admin\Mails\MailNotify;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class SendEmail implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $data;
protected $users;
/**
* Create a new job instance.
*
* @param $data
*/
public function __construct($data, $users)
{
$this->data = $data;
$this->users = $users;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
foreach ($this->users as $user) {
Mail::to($user->email)->send(new MailNotify($this->data));
}
}
}
B4: Build một cái views cho mail của mình
(Đoạn này cũng không có gì chỉ html, css và lấy giá trị từ biến ae thoả sức sáng tạo)
Em demo nhẹ như này:
B5: Vậy là đến bước cuối rồi, mình muốn gửi mail lúc nào thì cứ ném cái thằng SendEmail::dispatch vào =))
Cấu trúc thư mục trong demo này cho HMVC em để như dưới ảnh luôn nhé =))
** Nếu mọi người bị lỗi 235-535 thì đọc bài này giúp em nhé:
https://www.extendfeature.com/failed-to-authenticate-on-smtp-server-with-username/
fix trong 30s thui ạ.
Kết bài:
-Tuy bài chia sẻ kiến thức không mới mẻ gì nhưng hi vọng nó sẽ giúp ích được cho mọi người đặc biệt là những newbie như em ạ!
-Lần đầu tiên em viết bài nên còn nhiều sai sót, có phần nào em đang hiểu sao mong nhận được sự góp ý của mọi người ạ. Mọi người nhớ like và subscribe cho kênh của em nhé!!!