0

Notification trong Laravel 5.3 (Phần I)

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.

Thông thường, notification thường ngắn gọn, cung cấp thông tin cho người dùng về vấn đề xảy ra với ứng dụng của họ. Ví dụ, bạn đang viết một ứng dụng thanh toán, bạn có thể gửi một "hóa đơn trả tiền" thông báo đến người dùng qua các kênh email và tin nhắn SMS.

Trong phần 1 này mình sẽ giới thiệu với các bạn về các tạo, gửi notification và Mail Notification.

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 Artisan make:notification.

php artisan make:notification InvoicePaid

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) để chuyển đổi các notification thành một tin nhắn được tối ưu hóa cho kênh cụ thể.

Gửi Notification

Notification có 2 các 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

    Triat này được sử dụng mặc định trong model App\User và chứa một phương thức để gửi notification: notify()

  use App\Notifications\InvoicePaid;

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

Lưu ý: bạn có thể sử dụng Illuminate\Notifications\Notifiable ở bất cứ model nào bạn muốn. Bạ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 InvoicePaid($invoice));
  • 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. Phương thức via() nhận một $notification là instance của notification sẽ được gửi đi. Bạn sẽ sử dụng $notification để xác định kênh mà notification được gửi đến.

      /**
     * Get the notification's delivery channels.
     *
     * @param  mixed  $notifiable
     * @return array
     */
    public function via($notifiable)
    {
        return $notifiable->prefers_sms ? ['nexmo'] : ['mail', 'database'];
    }
  • Queueing Notifications

    Việc gửi notification có thể mất thời gian, đặc biệt khi mà bạn cần gọi đến một API bên ngoài để thực hiện việc gửi. Để tăng tốc độ phản hồi của ứng dụng bạn có thể đưa notification của bạn vào hàng đợi bằng cách sử dụng ShouldQueue interface và Queueable trait trong model của bạn. Interface và triat đã được import sẵn khi bạn chạy Artisan command make:notification vì vậy bạn có thể bổ xung 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;

		// ...
	}
Một khi mà ShouldQueue được thêm vào notification của bạn, bạn vẫn có thể gửi các notification một cách bình thường. Laravel sẽ tự động phát hiện ShouldQueue và đưa notification của bạn vào hàng đợi.
	$user->notify(new InvoicePaid($invoice));
Nếu bạn muốn delay thời gian gửi notification thì bạn có thể nối thêm phương thức delay().
	$when = Carbon::now()->addMinutes(10);

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

Mail Notifications

  • Định dạng mail

    Nếu một notification đượ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 nhận vào một $notification là thể hiện của notification và phải trả ra một thể hiện của Illuminate\Notifications\Messages\MailMessage. Chúng ta cùng xem một ví dụ của phương thức toMail():

    /**
     * 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)
                    ->greeting('Hello!')
                    ->line('One of your invoices has been paid!')
                    ->action('View Invoice', $url)
                    ->line('Thank you for using our application!');
    }
Lưu ý: Khi gửi mail notification, hãy chắc chắn rằng bạn đã thiết lập name trogn config/app.php. Giá trị này được sử dụng trong header và footer của tin nhắn mail notification của bạn
  • Tùy biến người nhận

    Khi gửi mail notification thì hệ thống notification sẽ tự động tim kiếm tài khoản email trên thực thể bạn khai báo.Bạn có thể tùy chỉnh đia chỉ email được sử dụng để cung cấp các notification bằng cách khai báo phương thức routeNotificationForMail trên thực thể:

  <?php

	namespace App;

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

	class User extends Authenticatable
	{
		use Notifiable;

		/**
		 * Route notifications for the mail channel.
		 *
		 * @return string
		 */
		public function routeNotificationForMail()
		{
			return $this->email_address;
		}
	}
  • Tùy biến chủ đề

    Theo mặc định, chủ đề của email chính là tên lớp của notification. Để thay đổi điều này bạn có thể gọi phương thức subject:

 	/**
	 * Get the mail representation of the notification.
	 *
	 * @param  mixed  $notifiable
	 * @return \Illuminate\Notifications\Messages\MailMessage
	 */
	public function toMail($notifiable)
	{
		return (new MailMessage)
					->subject('Notification Subject')
					->line('...');
	}
  • Error Messages

    Đôi khi notification của dùng để thông báo cho người dùng một lỗi nào đó. Khi đó bạn có thể sử dụng phương thức error():

	  /**
	 * Get the mail representation of the notification.
	 *
	 * @param  mixed  $notifiable
	 * @return \Illuminate\Notifications\Message
	 */
	public function toMail($notifiable)
	{
		return (new MailMessage)
					->error()
					->subject('Notification Subject')
					->line('...');
	}

Phần I của bài giới thiệu Notification trong Laravel 5.3 đến đây là hết, hẹn gặp lại các bạn trong phần 2 về Database Notifications, Broadcast Notifications, SMS Notifications, Slack Notifications...

Tài liệu tham khảo

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


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í