Bila anda mengikut tutorial yang ada di Mengirim Email dengan Mailables di Laravel 5.4, anda tentu merasa proses pendaftaran user baru terasa lambat, karena disitu juga Laravel langsung mengirim email notifikasi. Solusinya adalah dengan menggunakan queue (antrian) yang sudah menjadi bawaan standart Laravel.
Contoh mengirim email di Laravel 5.6 ditambah dengan queue
Install Laravel 5.6
Disini saya akan menggunakan Laravel 5.6. Buat project baru
composer create-project --prefer-dist laravel/laravel laravel
Pindah ke direktori laravel yang baru dibuat, lalu install guzzle
cd laravel; composer require guzzlehttp/guzzle
Setting .env
yang perlu anda ubah di .env adalah bagian dibawah ini, sesuaikan database anda dan juga username/password dari mailtrap.io
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=homestead DB_USERNAME=homestead DB_PASSWORD=null MAIL_DRIVER=smtp MAIL_HOST=smtp.mailtrap.io MAIL_PORT=2525 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null
satu lagi yang wajib adalah ubah QUEUE_DRIVER=sync
menjadi QUEUE_DRIVER=database
Generate queue table dan authentikasi
php artisan queue:table php artisan make:auth
lalu jalankan migrate agar database tersebut dimasukkan kedalam database.
php artisan migrate
Bila kita mengakses http://localhost/laravel/public/
, kita sudah bisa membuat akun baru
Tiap user yang mendaftar kita akan mengirim email ke alamat email yang didaftarkan.
Membuat mailable
Kita akan membuat mailable untuk mengirim email ke orang yang mendaftar disitus Laravel yang kita buat.
php artisan make:mail PendaftaranUser
perintah diatas akan menggenerate template standart untuk mengirim email. Letaknya ada di folder app/Mail/
. Ubah PendaftaranUser.php menjadi
<?php namespace App\Mail; use Illuminate\Bus\Queueable; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; class PendaftaranUser extends Mailable { use Queueable, SerializesModels; public $user; /** * Create a new message instance. * * @return void */ public function __construct($user) { $this->user = $user; } /** * Build the message. * * @return $this */ public function build() { return $this->view('email.pendaftaranuser'); } }
template email yang dikirim akan kita simpan di folder resources/views/email
. Buat file pendaftaranuser.blade.php
di folder tersebut yang isinya
Hai, {{ $user->name }},<br> terimakasih telah bergabung bersama <a href="https://jaranguda.com">jaranguda.com</a>
Ubah RegisterController.php
Ubah file app/Http/Controllers/Auth/RegisterController.php
menjadi
<?php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use App\Mail\PendaftaranUser; use App\User; use Illuminate\Foundation\Auth\RegistersUsers; use Illuminate\Support\Facades\Validator; class RegisterController extends Controller { /* |-------------------------------------------------------------------------- | Register Controller |-------------------------------------------------------------------------- | | This controller handles the registration of new users as well as their | validation and creation. By default this controller uses a trait to | provide this functionality without requiring any additional code. | */ use RegistersUsers; /** * Where to redirect users after registration. * * @var string */ protected $redirectTo = '/home'; /** * Create a new controller instance. * * @return void */ public function __construct() { $this->middleware('guest'); } /** * Get a validator for an incoming registration request. * * @param array $data * @return \Illuminate\Contracts\Validation\Validator */ protected function validator(array $data) { return Validator::make($data, [ 'name' => 'required|string|max:255', 'email' => 'required|string|email|max:255|unique:users', 'password' => 'required|string|min:6|confirmed', ]); } /** * Create a new user instance after a valid registration. * * @param array $data * @return \App\User */ protected function create(array $data) { $user = User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => bcrypt($data['password']), ]); \Mail::to($data['email'])->send(new PendaftaranUser($user)); return $user; } }
Coba buat akun baru, lalu cek inbox anda di mailtrap
Membuat Queue
Agar aplikasi web yang kita buat lebih responsive ada baiknya proses pengiriman email kita jalankan dibackground, jadi user akan merasa proses pendaftarannya lebih cepat karena tidak ada jeda dalam pengiriman email.
Cara standart untuk mengirim email ke queue
, cukup mengubah send()
menjadi queue()
, sehingga function create()
di RegisterController.php
menjadi
protected function create(array $data) { $user = User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => bcrypt($data['password']), ]); \Mail::to($data['email'])->queue(new PendaftaranUser($user)); return $user; }
sebelum membuat akun baru, jalankan dari command line
php artisan queue:work
Coba buat akun baru, nanti di terminal anda akan muncul kira-kira
[2018-02-23 15:00:02][1] Processed: App\Mail\PendaftaranUser
semua proses queue
tersebut dimasukkan kedalam tabel jobs
di database
Sampai disini usai sudah proses penggunaan queue mail di Laravel 5.6
Brati fungsi konfirmasi email bawaan laravel sudah tidak terpakai ya kalau pakai queue?
Masih tetap terpake, emailnya yang di queue