12/08/2018, 14:05

Notification in Laravel 5.3 (Phần 2)

Tiếp tục với chủ đề Notification in Laravel 5.3. Trong phần 2 này chúng ta sẽ cùng tìm hiểu về Database Notifications, Broadcast Notifications và Notification Events. Database Notifications Điều kiện Database notification cho phép bạn lưu trữ thông tin notification trong bảng của database. ...

Tiếp tục với chủ đề Notification in Laravel 5.3. Trong phần 2 này chúng ta sẽ cùng tìm hiểu về Database Notifications, Broadcast Notifications và Notification Events.

Database Notifications

  • Điều kiện

    Database notification cho phép bạn lưu trữ thông tin notification trong bảng 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
  • Đị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 bảng mà bạn định nghĩa.

	public function toArray($notifiable)
	{
		return [
			'invoice_id' => $this->invoice->id,
			'amount' => $this->invoice->amount,
		];
	}
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().
  • Truy cập Notification

    Một khi notification được lưu trữ trong database, bạn cần một các thuận tiện để truy cập chúng từ đơn vị khai báo của bạn. IlluminateNotificationsNotifiable trait được include mặc định trong model AppUser có bao gồm một notification Eloquent relationship và trà về notification của thực thể. Để lấy notification bạn cũng thực hiện như bất kì một Eloquent relationship khác. Mặc định các notification được lấy ra sắp xếp theo created_at:

	$user = AppUser::find(1);

	foreach ($user->notifications as $notification) {
		echo $notification->type;
	}
Nếu bạn chỉ muốn lấy ra các notification chưa được đọc. Bạn có thể sử dụng unreadNotifications relationship.
	$user = AppUser::find(1);

	foreach ($user->unreadNotifications as $notification) {
		echo $notification->type;
	}
  • Đánh dấu một Notification là đã đọc

    Thông thường, bạn sẽ muốn đánh dấu một notification là đã đọc khi mà user đã nhìn thấy nó. Để làm điều đó IlluminateNotificationsNotifiable cung cấp một phương thức là markAsRead, nó sẽ cập nhật trường read_at trong database:

	$user = AppUser::find(1);

	foreach ($user->unreadNotifications as $notification) {
		$notification->markAsRead();
	}
Tuy vậy bạn có thể sử dụng markAsRead() cho cả một collection thay cho việc phải duyệt qua từng notification.
	$user->unreadNotifications->markAsRead();
Bạn cũng có thể đánh dấu tất cả các notification mà không cần lấy chúng nên.
	$user = AppUser::find(1);

	$user->unreadNotifications()->update(['read_at' => Carbon::now()]);
Và chắc chắn là bạn có thể xóa các notification.
	$user->notifications()->delete();

Broadcast Notifications

  • Điều kiện

    Trước khi phát sóng notification, bạn nên cấu hình và làm quen với Laravel's event broadcasting services

  • Định dạng Broadcast Notifications

    Các broadcast channel sử dụng Laravel's event broadcasting services cho phép các JavaScript client của bạn nhận notification theo thời gian thực. Nếu một notification hỗ trợ phát sóng bạn nên đinh nghĩa một phương thức toBroadcast 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 encoded như là JSON và phát sóng đến JavaScript client của bạn.

	public function toArray($notifiable)
	{
		return [
			'invoice_id' => $this->invoice->id,
			'amount' => $this->invoice->amount,
		];
	}
Lựa chọn giữa toBroadcast() và 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 toBroadcast() thay thế cho toArray().
  • Lắng nghe Notification

    Notification sẽ phát sóng trên một kênh riêng tư với quy ước là {notifiable}.{id}. Vì vậy, nếu bạn gửi một notification đến AppUser với id là 1, thì thông báo sẽ được phát sóng trên kênh riêng tư App.User.1. Khi sử dụng Laravel Echo, bạn có thể lắng nghe một cách đơn giản.

	Echo.private('App.User.' + userId)
    .notification((notification) => {
        console.log(notification.type);
    });

Notification Events (Sự kiện)

Khi một notification được gửi, sự kiện IlluminateNotificationsEventsNotificationSent sẽ được kích trong hệ thống notification. Nó chứa thực thể "notifiable" và thể hiện của notification. Bạn có thể đăng kí các bộ lắng nghe sự kiện này trong EventServiceProvider.

protected $listen = [
    'IlluminateNotificationsEventsNotificationSent' => [
    'AppListenersLogNotification',
    ],
];

Trong một sự kiện lắng nghe, bạn có thể truy cập đến notifiable, notification và các thuộc tính của kênh sự kiện

public function handle(NotificationSent $event)
{
// $event->channel
// $event->notifiable
// $event->notification
}

0