0

Tìm hiểu về notification trong Laravel 5.3 (P1)

Giới thiệu

Như chúng ta được biết ở các phiên bản trước của Laravel bên cạnh việc hỗ trợ gửi mail thì ở phiên bản mới ra gần đây phiên bản Laravel 5.3 đã hộ trợ cho chúng ta gửi một notification qua 1 loạt kênh phân phối như Slack, Sms(thông qua Nexmo) với một thông điệp gì đấy . Ví dụ là một thông điệp cho chúng ta biết rằng bạn đã đăng kí tài khoản một cách thành công hoặc bạn đã mua hàng thành công ở một trang web nào đó ....

Tạo notification

Trong Laravel mỗi một notification sẽ được tạo ra trong thư mục app\Notifications. Nếu bạn chưa thấy thư mục đó thì đừng nó lắng khi bạn chạy lênh make:notifications ở command nó sẽ sinh ra thư mục đó cho bạn .

php artisan make:notification InvoicePaid

Với câu lệnh trên, InvoicePaid chính là class notification mà bạn muốn làm việc. File InvoicePaid.php sẽ được hiển thị như sau:

<?php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use App\Notifications\InvoicePaid;

class InvoicePaid extends Notification
{
    use Queueable;

    /**
     * Create a new notification instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Get the notification's delivery channels.
     *
     * @param  mixed  $notifiable
     * @return array
     */
    public function via($notifiable)
    {
        return ['mail'];
    }

    /**
     * Get the mail representation of the notification.
     *
     * @param  mixed  $notifiable
     * @return \Illuminate\Notifications\Messages\MailMessage
     */
    public function toMail($notifiable)
    {
        return (new MailMessage)
                    ->line('The introduction to the notification.')
                    ->action('Notification Action', 'https://laravel.com')
                    ->line('Thank you for using our application!');
    }

    /**
     * Get the array representation of the notification.
     *
     * @param  mixed  $notifiable
     * @return array
     */
    public function toArray($notifiable)
    {
        return [
            //
        ];
    }
}

  • Hàm via (bắt buộc): hàm này nhận một thực thể $notifiable, thực thể này dùng để định nghĩa việc notifications sẽ được gửi qua kênh truyền nào (vd email, sms, slack, database, broatcasts...).
  • Một số hàm như toMail, toDatabase, toSlack... để xác định các thông số của notification gửi đến từng kênh truyền cụ thể. Ví dụ như trong hàm toMail ta có thể thấy được nó nhận thực thể $notifiable và trả về một đối tượng của Illuminate\Notifications\Messages\MailMessage. Có thể các bạn sẽ không hiểu những dòng hàm line('...'), action('...') lấy từ đâu, rất đơn giản, bạn chỉ cần tìm đến class MailMessage, vì class này extends SimpleMessage nên bạn cần đi đến class SimpleMessage để hiểu được những hàm mình cần sử dụng.

Gửi một Notification

Notification có 2 cách gửi là: sử dụng phương thức notify() của Notifiable Triat và sử dụng Notification Facade.

  • Sử dụng Notifiable Trait

Trait này được sử dụng mặc định trong model App\User và chứa một phương thức dùng để send notifications đó là notify.

use App\Notifications\InvoicePaid;

$user->notify(new InvoicePaid($invoice));
  • Sử dụng Notification Facade

Ngoài ra bạn có thể sử dụng Notification Facade . Bạn có thể dùng cách này để send cùng một lúc cho nhiều User bằng method send :

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

Queue Notification

Các notifications được gửi đi sẽ tốn nhiều thời gian , đặc biệt nếu cần gọi đến một API bên ngoài để cung cấp cho notification. Để tăng tốc độ thời gian phản hồi của ứng dụng thì chúng ta nên để các notification được xếp vào hàng đợi bằng cách thêm vào các giao diện ShouldQueue và *Queueable. Interfacetriat đã được import sẵn khi bạn chạy lệnh make:notification , vì vậy bạn có thể add chúng ngay lập tức.

<?php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;

class InvoicePaid extends Notification implements ShouldQueue
{
    use Queueable;

    // ...
}
$user->notify(new InvoicePaid($invoice));

Hoặc bạn có thể trì hoãn , delay notification với một thời gian cụ thể. Chúng ta sử dụng method delay:

$when = Carbon::now()->addMinutes(10);

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

Sau đây là một ví dụ cho về gửi Mail notifications

  • Nếu một thông báo được gửi như một email , bạn cần xác định một phương thức toMail() trong lớp notification . Phương thức này sẽ nhận một $notifiable và trả lại một Illuminate\Notifications\Messages\MailMessage. Mail message này chứa các dòng văn bản giống như một call to action . Bây giờ chúng ta cùng xem xét ví dụ với method toMail():
public function toMail($notifiable)
{
    $url = url('/invoice/'.$this->invoice->id);

    return (new MailMessage)
                ->greeting('Hello!')
                ->line('One of your invoices has been paid!')
                ->action('View Invoice', $url)
                ->line('Thank you for using our application!');
}

Lưu ý : Khi chúng ta gửi một notifictions chúng ta nên chắc chắn rằng đã thiết lập name trong config/app.php

Ở bài viết này tôi đã chia sẻ tóm lược qua nhưng nội dung cơ bản về notification . Ở bài viết tiếp theo tôi xin trình bày kĩ hơn ví dụ cụ thể về gửi notification qua Slack, Database, BroadCast, SMS.Cảm ơn bạn đã quan tâm.

TÀI LIỆU THAM KHẢO


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí