Giới thiệu về Notification
Notification trong Laravel thường ngắn gọn nhưng nó vẫn cung cấp đầy đủ thông tin cho người dùng về những vấn đề có liên quan đến ứng dụng của người dùng. Ví dụ bạn đang tạo một ứng dụng thanh toán, bạn có thể gửi hóa đơn trả tiền và thông báo điều đó đến người dùng thông qua email và tin nhắn SMS tới họ. Các bạn cũng có thể lưu notification trong database để nó cũng hiển thị trên giao diện website.
Một notification đã được tự thiết lập để gửi thông báo đến người dùng là ứng dụng đã thực hiện thành công một công việc nào đó. Gửi thông tin khuyến mãi đến các khách hàng, mời các khách hàng tham dự một webinar hoặc một sự kiện nào đó cũng thuộc notification. Và Laravel 5.3 trở lên có thể hỗ trợ các bạn thực hiện điều đó.
Cách tạo Notification
Mỗi notification trong Laravel được đại diện bởi một class. Một class thường lưu trong thư mục app/Notifications. Nếu không thấy thư mục này trong dự án của bạn, thì nó cũng sẽ xuất hiện khi bạn thực hiện lệnh Artisan make:notification. Ví dụ:
php artisan make:notification InvoicePaid
Lệnh đó sẽ tự đặt một class notification mới trong thư mục app/Notifications. Mỗi một class của notification có một phương thức riêng và một biến số các phương thức báo (toMail hoặc toDatabase). Điều này giúp chuyển các notification thành dạng thông tin thông báo (email và tin nhắn) nhanh và tối ưu cho kênh cụ thể.
Với câu lệnh ở ví dụ trên, InvoicePaid là class notification mà các bạn muốn thực hiện. File InvoicePaid.php sẽ hiển thị như thế này:
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 (thường là bắt buộc): nó có nhiệm vụ nhận một thực thể $notifable. Nó cũng có thể định nghĩa notifications nào sẽ được gửi qua kênh truyền nào (email, tin nhắn SMS, Slack, Database, Broadcasts,…).
Một số hàm (toMail, toDatabase, toSlack) dùng để xác nhận các thông số cụ thể của notification – sẽ gửi tới từng kênh cụ thể. Ở ví dụ hàm toMail, các bạn thấy nó đã nhận được thực thể $notifiable và trả về một đối tượng của Illuminate\Notifications\Messages\MailMessage.
Các hàm line(‘…’) và action(‘…’) từ đâu? Bạn chỉ cần tìm đến class MailMessage vì class đó đã mở rộng SimpleMessage. Do đó, bạn chỉ cần tìm tới class SimpleMessage để hiểu được các hàm đã dùng.
Hướng dẫn gửi một notification
Notification thường có 2 cách để gửi – các bạn dùng phương thức notify() của Notifiable Triat hoặc dùng Notification Façade.
Nếu chọn sử dụng Notifiable Trait
Notifiable Trait thường được dùng mặc định trong model App\User và có chứa một phương thức để gửi notifications. Nó chính là phương thức notify.
use App\Notifications\InvoicePaid;
$user->notify(new InvoicePaid($invoice));
Nếu chọn sử dụng Notification Façade
Notification Façade cho phép các bạn gửi nhiều notification cho nhiều người dùng cùng lúc bằng phương thức method send. Ví dụ:
Notification::send($users, new InvoicePaid($invoice));
Queue Notification là gì?
Gửi các notification sẽ mất khá nhiều thời gian. Công đoạn này càng tốn thời gian hơn khi các bạn cần gọi đến API bên ngoài để cung cấp thêm cho notification. Để khắc phục vấn đề này, các bạn nên để các notification được xếp vào hàng ngay ngắn và đợi. Bằng cách nào? Chúng ta thêm vào các giao diện ShouldQueue và *Queueable. Interface và Triat thì đã được nhập vào sẵn khi bạn cho thực hiện lệnh make:notification. Do đó, bạn có thể bổ sung nó mà không còn chờ đợi gì nữa.
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));
Đôi khi, các bạn cần sử dụng delay notification nhưng với một khoảng thời gian đã xác định trước. Khi đó, các bạn nên dùng phương thức method delay.
$when = Carbon::now()->addMinutes(10);
$user->notify((new InvoicePaid($invoice))->delay($when));
Mail notifications là gì?
Định dạng mail
Nếu một notification gửi đi như một email, các bạn cần xác định phương thức toMail() trong lớp notification trước. Phương thức đó nhận vào một $notification để thể hiện notification và phải trả ra một kết quả được thể hiện từ Illuminate\Notifications\Messages\MailMessage. Ví dụ như sau:
/**
* 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!');
}
Khi gửi mail notification, các bạn đừng quên lập tên trong file config/app.php. Giá trị được sử dụng trong header và footer của tin nhắn mail notification của bạn.
Tùy chỉnh người nhận email
Một khi gửi mail notification, thì hệ thống sẽ tự tìm tài khoản email người dùng thực để bạn khai báo cho chính xác. Trong lúc thực hiện, bạn có thể điều chỉnh địa chỉ email được sử dụng để thêm các notification vào. Đó là khai báo phương thức routeNotificationForMail.
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;
}
}
Điều chỉnh chủ đề
Một chủ đề của email thường mặc định là tên lớp của notification. Để thay đổi, các bạn dùng 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('...');
}
Giải quyết các tin nhắn bị lỗi
Notification còn dùng để thông báo lỗi gì đó cho người dùng. Các bạn lập trình nên 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('...');
}
SMS Notifications
Khi gửi tin nhắn notification trong Laravel, nó được cung cấp từ Nexemo. Trước khi gửi tin nhắn thông qua Nexemo, các bạn đừng quên cài Laravel/nexmo-notification-channel.
composer require guzzlehttp/guzzle
Cài đặt trong config/services.php sẽ như thế này:
'nexmo' => [
'key' => env('NEXMO_KEY'),
'secret' => env('NEXMO_SECRET'),
'sms_from' => '15556666666',
],
/**
* Get the Nexmo / SMS representation of the notification.
*
* @param mixed $notifiable
* @return NexmoMessage
*/
public function toNexmo($notifiable)
{
return (new NexmoMessage)
->content('Your SMS message content')
->from('15554443333');
}
Định tuyến SMS Notifications
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use Notifiable;
/**
* Route notifications for the Nexmo channel.
*
* @param \Illuminate\Notifications\Notification $notification
* @return string
*/
public function routeNotificationForNexmo($notification)
{
return $this->phone;
}
}
Slack Notifications
composer require guzzlehttp/guzzle
/**
* Get the Slack representation of the notification.
*
* @param mixed $notifiable
* @return SlackMessage
*/
public function toSlack($notifiable)
{
$url = url('/exceptions/'.$this->exception->id);
return (new SlackMessage)
->error()
->content('Whoops! Something went wrong.')
->attachment(function ($attachment) use ($url) {
$attachment->title('Exception: File Not Found', $url)
->content('File [background.jpg] was not found.');
});
}
Một slack notification hoàn thiện sẽ như sau:
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use Notifiable;
/**
* Route notifications for the Slack channel.
*
* @param \Illuminate\Notifications\Notification $notification
* @return string
*/
public function routeNotificationForSlack($notification)
{
return 'https://hooks.slack.com/services/...';
}
}
Cập nhật thêm được vài kiến thức mới
Bài viết hữu ích.
Hữu ích
Cảm ơn Admin. Bài viết khá hay !
OK bạn, mình sẽ sắp xếp viết một bài về Extend Validation. Cảm ơn bạn đã quan tâm nhé.