Viblo Learning
+2

Notifications in Laravel 5.3

Xin chào các bạn! Trong chúng ta chắc hẳn ai cũng biết một sự kiện làm xôn xao cộng đồng web gần đây đó là sự ra đời của Laravel 5.3. Đương nhiên cái gì ra đời sau cũng sẽ có những cải tiến đáng kể so với cái trước và Laravel cũng không phải ngoại lệ. Phiên bản 5.3 lần này hỗ trợ một số tiện ích như là foreach and loop object, toggle pivot table records, passport, scout... Trong số đó có Notifications. Hôm nay mình xin phép đưa ra những khái niệm cũng như cách sử dụng cơ bản nhất về Notifications mà Laravel 5.3 đem lại cho người lập trình.

Notifications là gì?

Trước tiên để tìm hiểu một vấn đề thì ta cần phải nắm rõ định nghĩa. Ở đây, notifications là một loại tin nhắn, thông điệp nhằm thông báo cho người dùng những gì xảy ra trong ứng dụng của họ. Laravel Notifications cho phép bạn thực hiện cập nhật nhanh qua các dịch vụ như Slack, SMS, hay Email mà không phải lưu dữ liệu vào database. Ví dụ khi bạn đăng kí một lớp học, hệ thống sẽ gửi tin nhắn đến email, hoặc SMS (thông qua Nexmo), hoặc tin nhắn đến chatroom (Slack) cho người dùng để họ biết họ đã đăng kí thành công hay chưa.

Tạo Notifications

Sau khi cài đặt thì các bạn có thể thấy cấu trúc thư mục của Laravel 5.3 có phần khác so với phiên bản trước. Để tạo một class notifications thì bạn chỉ cần vào terminal của project và gõ :

php artisan make:notification RegisterSuccess

Với câu lệnh trên, RegisterSuccess chính là class notification mà bạn muốn làm việc. Laravel 5.3 sẽ tạo ra cho bạn một thư mục app/Notifications để lưu trữ file đó. File RegisterSuccess.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;

class RegisterSuccess 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.

Nhắc nhiều đến Slack ở trên nhưng có thể rất nhiều bạn chưa biết đến Slack, mình xin được giới thiệu sơ qua:

  • Slack là là một dịch vụ chat mới, được phát triển để chúng ta hãy quên đi việc giao tiếp bằng email hay bằng các phần mềm chat thông thường như Skype, Yahoo, iMessage...
  • Nó có hai ưu điểm chính: một là đa nền tảng (Window, Mac , Android, iOS) nên mọi người trong công ty có thể chat nhóm với nhau bất kể họ dùng thiết bị gì; hai là khả năng liên kết với các ứng dụng lưu trữ của những hãng khác, ví dụ như Dropbox, Google Drive, GitHub… để cùng nhau theo dõi tiến độ công việc ngay trong cửa sổ chat của Slack. Nó đang được rất nhiều các tổ chức và công ty lựa chọn như dịch vụ chat hàng đầu.

Giờ thì mình mạn phép làm một ví dụ gửi Notifications thông qua dịch vụ Slack vừa là để mọi người biết đến một dịch vụ mới cũng là để nắm được việc sử dụng notifications trong Laravel 5.3.

Let's go!

Example

  • B1: Truy cập vào trang web slack.com
  • B2: Create new team, sau đó bạn nhập email và làm theo hướng dẫn
  • B3: Sau khi tạo thành công, giao diện hiển thị như hình sau:

Screenshot from 2016-09-26 16:25:51.png

  • B4: Nhấn vào tên team "Demo" góc trên cùng bên trái màn hình, sẽ có một dropdown đổ xuống, bạn chọn App & Intergrations. Ở đây bạn có thể tìm được các api hỗ trợ cho làm việc nhóm, search Incoming Webhooks, nói đơn giản nó là một api dùng để gửi message từ bên ngoài đến slack. Sau đó Add Configuration -> Privately to you -> Add Incoming WebHooks intergration
  • B5: Trong model User.php, viết 1 hàm
public function routeNotificationForSlack()
    {
        return 'webhook_url';
    }

Hàm này có nhiệm vụ đăng kí một Slack Webhooks. 'webhook_url' chính là URL sau khi bạn cài Incoming Webhooks.

  • B6: Vào file RegisterSuccess.php mà bạn tạo, viết lại hàm via như sau:
public function via($notifiable)
    {
        return ['slack'];
    }
  • B7: Xóa bỏ những hàm không cần thiết như toMailtoArray, thêm vào hàm toSlack:
public function toSlack($notifiable)
    {
        return (new SlackMessage)
            ->success()
            ->content($this->user->name. ' have successfully registered!')
            ->attachment(function ($attachment){
                $attachment->title('Register', url('user/1'))
                ->fields([
                    'Name' => $this->user->name,
                    'Email' => $this->user->email
                ]);
            });
    }

Hàm này sẽ trả về message gồm có một dòng chứa nội dung, một table hiển thị thông tin của người dùng đã đăng kí thành công gồm tên và email. Để gửi notifications bạn có thể vào file routes/web.php sử dụng hàm notify() như sau:

 Route::get('/home', function () {
    $user = App\User::find(1);

    $user->notify(new RegisterSuccess($user));
});

Vì hàm notify() nhận một thực thể của RegisterSuccess nên ta cần phải khai báo chúng trong file RegisterSuccess:

    protected $user;

    use Queueable;

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

Vậy là xong rồi, kết quả sẽ hiển thị như hình dưới đây: Screenshot from 2016-09-26 18:27:14.png

Rất đơn giản phải không?

Bài viết của mình đến đây là hết. Cảm ơn mọi người đã đọc, nếu có sai sót thì mong mọi người góp ý ở comment dưới đây nhé ^^! Many thanks 😗

Tham khảo

  1. Notifications Laravel 5.3: https://laravel.com/docs/5.3/notifications#sending-notifications
  2. What's new Laravel 5.3: https://laracasts.com/series/whats-new-in-laravel-5-3

All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.