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