Firebase Cloud Messaging (Notifikasi Aplikasi) Terjadwal Dengan Laravel Queue

Firebase Cloud Messaging (Notifikasi Aplikasi) Terjadwal Dengan Laravel Queue

By Reggi, 29 Dec 2022

Ketika anda menggunakan gooogle fcm melalui website firebase console, Anda akan menemukan sebuah menu untuk menjadwalkan notifikasi untuk dikiramkan kepada client. Namun ketika anda mengimplementasikan sendiri baik melalui postman atau api yang disediakan, Anda tidak akan menemukan konfigurasi untuk menjadwalkan nootifikasi anda.

Oleh karena itu, kita akan sedikit mengakali fitur notifikasi terjadwal. Dengan menggunakan laravel queue. Laravel queue adalah sebuah fitur yang disediakan oleh laravel unntuk membuat antrian. Tetapi penerapannya bisa dalam beberapa hal, Contohnya untuk memecah beban kerja pada suatu proses agar response time menjadi lebih cepat atau penerapan hal lain.

Kali ini kita akan menerapkan konsep laravel queue dengan studi kasus mengirimkan notifikasi yang terjadawal. pada laravel sendiri terdapat beberapa drivers yang tersedia untuk memproses task Queue diantaranya database, Amazon SQS, Redis, dan Beanstalkd. Studi kasus kali ini kita akan menggunakan database.

Pertama anda harus konfigurasi file .env

Buka project anda lalu buka file .env . jika tidak tersedia maka anda hanya perlu membuatnya.

APP_NAME=Laravel APP_ENV=local APP_KEY=base64:3k123123lm= APP_DEBUG=true APP_URL=http://localhost:8000 LOG_CHANNEL=stack LOG_LEVEL=debug DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=db DB_USERNAME=root DB_PASSWORD= BROADCAST_DRIVER=log CACHE_DRIVER=file FILESYSTEM_DRIVER=local QUEUE_CONNECTION=database SESSION_DRIVER=file SESSION_LIFETIME=120

Perhatikan pada bagian QUEUE_CONNECTION ubah sesuai driver yang anda pakai. pada kode diatas saya mengubahnya menjadi database.

Tahap kedua adalah membuat database queue

php artisan queue:table

jika sudah, kita migrate table queue dengan perintah dibawah ini :

php artisan migrate

Silahkan cek database anda seharusnya sekarang sudah ada table baru.

Tahap Ketiga adalah membuat file Job Class

Membuat job class untuk mengatur lalu lintas notifikasi yang akan dikirimkan. ketikan perintah dibawah ini pada terminal kalian.

php artisan make:job NotificationJob

maka akan muncul file baru pada folder job seperti gambar dibawah ini.

File Notification Job

Lalu buka file Notification jobnya. Ketik atau pastekan kode dibawah ini. saya akan menjelaskanya line kodenya satu persatu.

<?php namespace App\Jobs; 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; class NotificationJob implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; protected $dongeng; public $tries = 3; /** * Create a new job instance. * * @return void */ public function __construct($dongeng) { $this->dongeng = $dongeng; } /** * Execute the job. * * @return void */ public function handle() { $url = 'https://fcm.googleapis.com/fcm/send'; /*api_key available in: Firebase Console -> Project Settings -> CLOUD MESSAGING -> Server key*/ $api_key = env('API_KEYFCM'); $fields = array( 'to' => "/topics/dongeng", 'collapse_key' => "type_a", 'notification' => array( "body" => "Body Desc", "title" => "Title Desc", "image" => "https://image.jpg" ), "android" => array( "notification" => array( "image" => "https://image.jpg" ) ), 'data' => array( "body" => "Body Desc", "title" => "Title Desc", "link" => "https://image.jpg" ) ); //header includes Content type and api key $headers = array( 'Content-Type:application/json', 'Authorization:key=' . $api_key ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields)); $result = curl_exec($ch); if ($result === FALSE) { die('FCM Send Error: ' . curl_error($ch)); } curl_close($ch); return $result; } public function failed() { // usually would send new notification to admin/user } }

Pada function __construct kode diatas terdapat kode :

$this->dongeng = $dongeng;

Kode diatas berfungsi menampung parameter yang dikirim oleh controller.

Lalu pada public function handle() kode ini berfungsi sebagai kode yang akan di eksekusi ketika queue berjalan.

Kode dibawah ini untuk mendefiniskan end point.

$url = 'https://fcm.googleapis.com/fcm/send';
$api_key = env('API_KEYFCM');

Selanjutnya definisikan parameter yang akan dikirim ke google fcm.

$fields = array(                                           
'to' => "/topics/dongeng",                                         'collapse_key' => "type_a",  
'notification' => array( .....

Tahap Keempat membuat controller disertai logic untuk mengirimkan notifikasi.

Untuk membuat controller silahkan jalankan perintah tersebut

php artisan make:controller NotificationController

Sekarang cek pada folder app/Http/Controllers maka akan terdapat 1 file baru dengan nama NotificationController.

buka file NotificationController.php lalu tambahkan kode dibawah ini.

public function sendnotification(Request $request) { $dongeng = Post::find($request->id); $delay = Carbon::parse()->floatDiffInMinutes('17:00:00'); dispatch(new NotificationJob($dongeng))->delay(now()->addMinutes($delay)); return redirect()->route('posts.index') ->with('success', 'Notification Dongeng ' . $dongeng->title . ' will send in ' . ($delay / 60) . ' hours'); }

Pada kode diatas terdapat logika untuk menghitung waktu mundur ke jam 17.00 ketika notifikasi akan dikirimkan. Carbon::parse()->floatDiffInMinutes(‘17:00:00’) hasilnya akan berbentuk menit yang akan dikirimkan ke queue. anda Bisa membuat logic anda sendiri dengan menghitung mundur bedasarkan menit, jam dan hari.

Kita juga dapat mengirimkan parameter ke job class dengan kode berikut ini

dispatch(new NotificationJob($dongeng))->delay(now()->addMinutes($delay));

Hore sekarang anda bisa mengirimkan notifikasi secara terjadwal menggunakan laravel Queue. Pembahasan kali ini hanya sampai disini saja. jika ada koreksi dan pertanyaan bisa langsung kontak saya. terima kasih