12/08/2018, 15:02

Database Notification System in laravel 5.3

Giới Thiệu: Bên cạnh việc hỗ trợ gửi mail, bắt đầu từ phiên bản 5.3 mới được phát hành, Laravel cung cấp thêm tính năng gửi notification qua một loạt các kênh phân phối, bao gồm mail, tin nhẵn SMS (thông qua Nexmo) và Slack. Notification cũng có thể được lưu trong database để có thể hiển thị trên ...

Giới Thiệu:

Bên cạnh việc hỗ trợ gửi mail, bắt đầu từ phiên bản 5.3 mới được phát hành, Laravel cung cấp thêm tính năng gửi notification qua một loạt các kênh phân phối, bao gồm mail, tin nhẵn SMS (thông qua Nexmo) và Slack. Notification cũng có thể được lưu trong database để có thể hiển thị trên giao diện web. Ở đây mình sẽ giới thiệu với các bạn tạo, gửi notification , lưu notification vào database.

Tạo Bảng Notifications

Database notification cho phép bạn lưu trữ thông tin notification trong bảng notifications của database. Bảng này sẽ chứa các loại thông tin của notification như loại notification cũng như tùy chỉnh dữ liệu JSON để mô tả notification. Bạn có thể truy vấn các bảng để hiển thị notifications lên giao diện người dùng trên hệ thống của bạn. Nhưng trước khi thực hiện được điều đó, bạn cần tạo bảng trong database để lưu trữ các notification của bạn. Bạn có thể sử dụng lệnh notifications:table để taọ ra migration.

php artisan notifications:table
php artisan migrate

Khi đó sẽ tạo ra cho bạn một bảng notifications giống như sau:

Schema::create('notifications', function (Blueprint $table) {
            $table->uuid('id')->primary();
            $table->string('type');
            $table->morphs('notifiable');
            $table->text('data');
            $table->timestamp('read_at')->nullable();
            $table->timestamps();
});
  • type : lưu namespace notification của bạn (namespace AppNotificationsCreatePost);
  • morphs('notifiable') : sẽ generate ra 2 columns quan trọng là : notifiable_id và notifiable_type (giữ tên model ở đây là AppModelsUser)

Tạo Notification

Trong Laravel, mỗi một notification được đại diện bởi một một class (thường được lưu trữ trong thư mục app/Notifications). Đừng lo lắng nếu không thấy thư mục này trong project của bạn, nó sẽ được tạo ra khi bạn chạy lệnh

php artisan make:notification CreatePost

Lệnh này sẽ đặt 1 class notification mới trong thư mục app/Notifications. Mỗi một class notification có chứa một phương thức thông qua và một biến số các phương thức báo (ví du như toMail hoặc toDatabase hoặc toArray...) để chuyển đổi các notification thành một tin nhắn được tối ưu hóa cho kênh cụ thể.

<?php

namespace AppNotifications;

use IlluminateBusQueueable;
use IlluminateNotificationsNotification;
use IlluminateContractsQueueShouldQueue;
use IlluminateNotificationsMessagesMailMessage;
use AppModelsPost;

class CreatePost extends Notification
{
    use Queueable;

    protected $post;

    /**
     * Create a new notification instance.
     *
     * @return void
     */
    public function __construct(Post $post)
    {
        $this->post = $post;
    }

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

    /**
     * Get the array representation of the notification.
     *
     * @param  mixed  $notifiable
     * @return array
     */
    public function toArray($notifiable)
    {
        return $this->post->toArray();
    }
}

  • Định dạng Database Notifications: Nếu một notification hỗ trợ việc lưu trữ trong bảng của database thì bạn nên định nghĩa một phương thức toDatabase() hoặc toArray() trong lớp notification đó. Phương thức sẽ nhận một thực thể $$otification và nên trả về một mảng thuần. Mảng kết quả sẽ được encode như là JSON và lưu trữ trong trường data của bảng notifications.
public function toArray($notifiable)
{
    return $this->post->toArray();
}
Lựa chọn giữa toDatabase() vs toArray(): Phương thức toArray() thường được sử dụng bởi các broadcast channel đễ xác định dữ liệu được chuyển đến các JavaScript client. Nếu bạn muốn 2 array để đại diện cho database và broadcast channel, bạn nên định nghĩa phương thức toDatabase() thay thế cho toArray().
  • Cụ thể hóa các kênh phân phối Mỗi một class notification có một phương thức via() để xác định kênh nào sẽ được notification gửi đến. Khi được gửi đi, notification có thể được gửi đến các kênh như là mail, broadcast, database, nexmo hoặc là slack chanel. Ỏ đây mình đang giới thiệu Database Notification System nên via là database.

Gửi Notification:

use AppNotificationsCreatePost;
//send notify
 $user->notify(new CreatePost($post));

Lưu ý: bạn có thể sử dụng IlluminateNotificationsNotifiable ở bất cứ model nào bạn muốn. Không cần giới hạn nó chỉ trong model User của mình. Sử dụng Notification Facade: Ngoài ra bạn có thể sử dung Notification Facade để gửi notifications. Cách này khá thuận tiện khi bạn muốn gửi notification đến một tập hợp các user.

  Notification::send($users, new CreatePost($post));

Truy cập Notification:

Khi thông báo đã được lưu vào database, bạn sẽ lấy nó khá là đơn giản. IlluminateNotificationsNotifiable trait, nó được mặc định thêm vào bởi Laravel trong model AppUser, thêm một notifications Eloquent relationship sẽ trả về thông báo của thực thể. Để làm mới thông báo, bạn có thể truy cập phương thức này như bất kỳ Eloquent relationship khác. Mặc định, thông báo sẽ được sắp xếp theo created_at timestamp:

$user = AppUser::find(1);

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

Nếu bạn muốn nhận những thông báo "chưa đọc", bạn có thể sử dụng unreadNotifications relationship. Một lần nữa, những thông báo đó sẽ sắp xếp theo created_at timestamp:

$user = AppUser::find(1);

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

Tài Liệu Tham Khảo:

Laravel docs 5.3: https://laravel.com/docs/5.3/notifications

Ở trên mình đã giới thiệu cho các bạn những gì mình tìm hiểu về Database Notification, cảm ơn các bạn đã theo dõi và mong được sự đóng góp của mọi người.

0