Có gì mới trong Notification Laravel 5.3

Trong ứng dụng chức năng notification rất quan trọng, đôi khi không phải lúc nào chúng ta cũng theo dõi ứng dụng thường xuyên. Thật may mắn trong laravel 5.3 đã hỗ trợ đầy đủ để chúng ta có thể làm được chức năng này một cách đơn giản nhất. Ở bài viết này mình sẽ hướng dẫn làm notification tới kênh Slack. Tại sao lại là Slack vì slack có chat group, có app mobile và đơn giản là mình thích *_^

1. Hình dung trước khi làm

Khi có 1 sự kiện nào đó diễn ra cần thông báo, Chúng ta sẽ tạo ra 1 thông điệp cần thông báo và gửi thông điệp đó tới các kênh cần thông báo. Ở đây là Slack, vậy rõ ràng mình phải đưa thông điệp đó tới service của slack. Thật may slack quá mạnh nó chỉ yêu cầu gửi thông điệp đó tới Webhook của slack là đủ. Cuối cùng là trên điện thoại hoặc máy tính Slack sẽ buzz 1 cái để các bạn biết. Vậy là xong, tiện lợi hơn email khá nhiều, khỏi rưởm rà checkmail rồi dọn rác 😭

2. Kế hoạch có rồi bắt tay vào chiến thôi

Đọc qua cái docs đã uhm..ờ.. Không hiểu lắm nhưng hình như là thế này...

Tạo 1 thông báo đầu tiên

php artisan make:notification MyNotification

Notification created successfully. Ngon rồi xem lại cấu trúc có file nào mới ko nào app/Notifications/MyNotification.php Nội dung default nó na ná 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 MyNotification 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 [
            //
        ];
    }
}

Tiếp nào, Yêu cầu phải có package composer require guzzlehttp/guzzle Cài nuôn.

Bây giờ phải thông báo đến ai đây. Slack có chat group hay gửi vào đấy nuôn. Ồ không nên không may notification cần private thì sao. Vậy là mỗi đối tượng cần thông báo phải khai báo 1 Webhook url riêng rồi. Đọc tiếp docs nào

Open Model User.php lên nào app/User.php

<?php

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.
     *
     * @return string
     */
    public function routeNotificationForSlack()
    {
        return $this->slack_webhook_url;
    }
}

Hình như có 1 file trait Notifiable và method routeNotificationForSlack mới thì phải. còn $this->slack_webhook_url; Có lẽ phải thêm trường slack_webhook_url vào Table User trong database rồi.

Tạo WebhookURL

Đầu tiên phải đăng nhập Slack đã sau đó truy cập tới link (https://{yourteam}.slack.com/apps). và tìm tới app "Incoming Webhook"

Screenshot from 2016-11-25 17-22-56.png

Tạo mới 1 webhook url thôi https://hooks.slack.com/services/T0CEXX25P/B2VXXXRKL1/x6xxxxxxxxxxxxxx Vậy là mỗi user muốn thông báo notification phải lưu webhook url riêng vào trường slack_webhook_url rồi.

Tiếp nào quay lại class app/Notifications/MyNotification.php

/**
 * Get the Slack representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return SlackMessage
 */
public function toSlack($notifiable)
{
    return (new SlackMessage)
                ->content('Co mot thong bao moi danh cho ban');
}

new SlackMessage Cái này ở đâu ra đây ...! rõ ràng lại phải kéo tiếp thư viện Illuminate\Notifications\Messages\SlackMessage vào trong MyNotification rồi. Triển nuôn.!

Làm sao để nó call được method toSlack

public function via($notifiable)
{
    return ['mail', 'slack'];
}

Tuyệt vời, gửi 1 lúc nhiều kênh luôn, như mail, database, broadcast, SMS. Nó đã call sẵn cho chúng ta kênh thông báo qua mail rồi các bạn có thể bỏ đi nếu thích

Nội dung thông điệp có thể truyền vào từ nơi khác thông qua biến toàn cục mình hay sử dụng trong class app/Notifications/MyNotification.php

    protected $message;

    public function __construct($message)
    {
        $this->message = $message;
    }

Xong rồi vậy là đã khai báo xong service notification đến slack. Giờ làm sao mà dùng nó đây nhỉ. docs

Giả sử mình cần thông báo đến nhiều người mình sẽ phải lấy ra danh sách những người cần nhận được thông báo $users = app(\App\User::class)->all();

Notification::send($users, new MyNotification($message));

Đừng quên kéo thư viện use Illuminate\Support\Facades\Notification;app/Notifications/MyNotification.php tại nơi các bạn muốn sử dụng thông báo nhé.

Chúc các bạn thành công..!


All Rights Reserved