3 Min Read

Membuat Notification Email dan Database di Laravel

iman-sugirman Iman Sugirman

Laravel adalah Framework PHP yang sangat komplit menurut saya, karena hadir dengan fitur-fitur yang modern dan lengkap diantara lainnya. Anda bisa menggunakan Laravel untuk Skala Kecil maupun besar tergantung kebutuhan anda.

Menggunakan Notifikasi Email

Ketika anda akan mengirimkan email, invoice, estimasi dari Framework laravel maka anda perlu menggunakan fitur Notification dan saat ini saya akan membahas notifikasi dengan Email saja. Jika anda ingin menggunakan notifikasi ke channel lain anda bisa menggunakan Laravel Notification Channel.

Oke sekarang kita harus membuat notification_table atau mempublish table notifications

ketik diterminal :

php artisan notifications:table

dan akan membuat otomatis file di folder database/migrations dengan nama file xxx_create_notifications_table.php lalu lakukan migration

php artisan migrate

Buat Class Notification

Sekarang kita buat Class Notification baru dengan memasukan perintah :

php artisan make:notification InvoicePaid

yang mana akan tercipta file di folder App/Notifications dengan file InvoicePaid.php jangan lupa juga untuk menambahkan Notifiable di model yang akan diberi notifikasi, contohnya disini model User karena mengandung email untuk menerima Notifikasi.

<?php

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use Notifiable;
}

Untuk memastikan arah Notifikasi ke email user maka tambahkan juga :

    // Tambahkan ini di User Model `App\Models/User`
    public function routeNotificationForMail($notification)
    {
        // Jika di table users ada kolom email untuk notifikasi
        return $this->email;

        // Jika di table users ada kolom email dan nama untuk notifikasi
        return [$this->email => $this->name];
    }

Saatnya mengatur Notifikasi yang tadi kita buat di App/Notifications/InvoicePaid di bagian toMail ubah dengan notifikasi yang anda inginkan misalnya :

/**
 * Get the mail representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return \Illuminate\Notifications\Messages\MailMessage
 */
public function toMail($notifiable)
{
    return (new MailMessage)
                // Sample Parameter Error
                // ->error()
                ->greeting('Hi Bro!')
                ->subject('Notification Subject')
                ->from('barrett@example.com', 'Barrett Blair')
                ->line('...')
                ->attach('/direktori/file.pdf');

}

Menggunakan Blade Markdown untuk Isi Email

Jika anda menginginkan lebih leluasa dengan isi emailnya maka :

php artisan make:notification InvoicePaid --markdown=mail.invoice.paid

dan akan membuat file di folder resources/views/mail/invoice/paid.blade.php dan anda bisa mengeditnya dengan bahasa markdown dan ubah file InvoicePaid menjadi seperti ini :

/**
 * Get the mail representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return \Illuminate\Notifications\Messages\MailMessage
 */
public function toMail($notifiable)
{
    $url = url('/invoice/'.$this->invoice->id);

    return (new MailMessage)
                ->subject('Invoice Paid')
                ->markdown('mail.invoice.paid', ['url' => $url]);
}

Ubah juga isi emailnya di folder resources/views/mail/invoice/paid.blade.php menjadi :

@component('mail::message')
# Invoice Paid

Your invoice has been paid!

@component('mail::button', ['url' => $url])
View Invoice
@endcomponent

Thanks,<br>
{{ config('app.name') }}
@endcomponent

Untuk Fitur-fitur Email nanti akan saya bahas di artikel selanjutnya.

Menyimpan Notifikasi ke Database

Ubah file InvoicePaid.php tadi bagian bawahnya di method toArray dengan parameter yang anda inginkan contohnya seperti ini.

/**
 * Get the array representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return array
 */
public function toArray($notifiable)
{
    return [
        'invoice_id' => $this->invoice->id,
        'amount' => $this->invoice->amount,
    ];
}

Dan anda bisa memunculkan notifikasi di setiap user dengan cara seperti ini :

$user = App\Models\User::find(1);

foreach ($user->notifications as $notification) {
    echo $notification->type;
}

Mengirimkan Notifikasi dari Controller

Untuk mengirimkan notifikasi anda perlu memberikan triger di controller / proses / action yang anda buat :

use Illuminate\Support\Facades\Notification;

Notification::send($users, new InvoicePaid($invoice));

Atau anda juga bisa menggunakan Delay background job atau queue dengan menambahkan seperti ini :

// parameter $delay ini berarti pekerjaan pengiriman email akan ditunda 10menit
$delay = now()->addMinutes(10);

$user->notify((new InvoicePaid($invoice))->delay($delay));

Menggunakan Provider SMTP untuk Mengirimkan Email

Biasanya ketika anda akan mengirimkan email maka diperlukan sender provider dan sekarang kita contohkan menggunakan Mailtrap sebelum menginstall / menggunakan Mailtrap install terlebih dahulu Guzzle Package :

composer require guzzlehttp/guzzle

Daftar terlebih dahulu di Mailtrap secara gratis untuk mendapatkan Credential untuk kita terapkan di .env file.

Lalu edit di .env file anda dan ubah seperti ini :

MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=xxxxxx
MAIL_PASSWORD=xxxxxx
MAIL_ENCRYPTION=tls

Jika sudah lalu coba proses pengiriman email tersebut.

happy coding....