Queue Mail in Laravel 8

min read

Day 24/100 Part 2 #100DaysOfCode

Ở bài viết trước mình đã tìm hiểu cách Create Mail in Laravel 8. Nhưng còn một nhược điểm là việc gửi mail rất tốn nhiều thời gian chờ đợi, làm cho website bị delay một thời gian, làm website bị đơ đơ tí, nếu mà nhiều người đặt hàng và gửi mail nhiều, ta nên dùng Queue (Hàng đợi) mail trong Laravel là cách tốt nhất.

Okay, tiếp tục với bài viết trước, bạn có thể xem lại đường link sau: Create Mail in Laravel 8

Dẫn giữ source code và cấu trúc bài viết trước, ta chỉ thao tác chỉnh một số thôi, hãy mở file .env lên chỉnh như sau

QUEUE_CONNECTION=database

Chạy lệnh dưới đây ta sẽ được file migration trong thư mục database/migrations , file mới được tạo ra, để thiết lập table "job"

php artisan queue:table

database/migrations/2021_07_07_034038_create_jobs_table.php

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateJobsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('jobs', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('queue')->index();
            $table->longText('payload');
            $table->unsignedTinyInteger('attempts');
            $table->unsignedInteger('reserved_at')->nullable();
            $table->unsignedInteger('available_at');
            $table->unsignedInteger('created_at');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('jobs');
    }
}

Tiếp tục ta hãy chạy lệnh migrate dưới đây, để tạo table "job" trong database cho ta

php artisan migrate

Okay, ta hãy xem database của ta, sẽ có một table được sinh ra, giờ ta hãy tạo một job(công việc) gửi mail cho khách như sau:

php artisan make:job OrderMailJob

Sau khi chạy xong, ta sẽ được một class OrderMailJob.php trong thư mục App\Jobs, ta hãy mở file đó lên chỉnh sửa lại như sau:

<?php

namespace App\Jobs;

use App\Models\Order;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Mail;
use App\Mail\OrderEmail; // including your class
class OrderMailJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    protected $orders;
    public function __construct(Order $orders)
    {
        $this->orders = $orders;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $orders = new OrderEmail($this->orders);
        Mail::to("mail_to_you@gmail.com")->send($orders);
    }
}

Đoạn code trên ta cần gọi class OrderEmail truyền cho nó một đối tượng $orders, và ta cũng gọi hàm gửi mail bình thường

Mail::to("mail_to_you@gmail.com")->send($orders);

Giờ ta chỉ cần gọi class OrderMailJob trong Controller là có thể gửi mail, cách gọi như sau:

use App\Jobs\OrderMailJob;
 public function index()
    {
        $orders = Order::findOrFail(2);

       //send mail
         dispatch(new OrderMailJob($orders));

        return View("email.order-mail")->with(array('orders'=>$orders));
    }

Vậy là xong, bạn nhớ xem lại bài viết trước, mới làm được bài này nghe. Vì bài này sử dụng source bài viết trước

Để xem Queue gửi mail, ta có thể xem danh sách nó như sau:

php artisan queue:listen

Vậy là xong

x

Ủng hộ tôi bằng cách click vào quảng cáo. Để tôi có kinh phí tiếp tục phát triển Website!(Support me by clicking on the ad. Let me have the money to continue developing the Website!)