Khi bạn đang mơ thì người khác đang nỗ lực.

Gửi message đến Slack chat từ ứng dụng Laravel

Slack ứng dụng chat nhóm phổ biến

Nếu bạn chưa biết Slack là gì? có thể tóm tắt qua vài câu dưới đây:

Slack là ứng dụng chat thông thường nhưng có khả năng kết nối đến hàng nghìn các ứng dụng, dịch vụ ngoài giúp quản lý thông tin làm việc theo nhóm tập trung. Các tài nguyên, thông tin dù là trong nội bộ, trên các dịch vụ cloud hay ở các hệ thống khác trên internet đều có thể tập trung về Slack. Một số ưu điểm của Slack như sau:

  • Slack là dịch vụ đa nền tảng do đó mọi người có thể trao đổi với nhau từ bất kỳ nền tảng nào như Windows, Linux, MacOS, Android, iOS...
  • Slack có khả năng liên kết với các ứng dụng lưu trữ của hãng thứ 3, ví dụ bạn có thể dễ dàng thiết lập kết nối Slack đến Google Drive, Dropbox, Google Calendar, Github, Task Reminder, Trello... thậm chí là cả các dịch vụ thanh toán.
  • Slack là miễn phí với các tổ chức nhỏ với giới hạn lưu trữ miễn phí lên đến 10K tin nhắn, 5GB dung lượng lưu trữ và kết nối đến 5 dịch vụ hãng khác, như vậy cũng là quá đủ. Các gói tính phí sẽ có nhiều tính năng cao cấp hơn và khả năng kết nối vô hạn.

Tại sao cần kết nối ứng dụng Laravel đến Slack

Trong phần trên, chúng ta có thể thấy rằng Slack giống như một message hub, tất cả mọi thứ tập trung về Slack. Do vậy, kết nối từ ứng dụng Laravel đến Slack là rất hữu ích. Ví dụ: bạn muốn khi phát sinh một hợp đồng tín dụng mới trên hệ thống của ngân hàng, thì sẽ có một tin nhắn vào kênh của phòng Tín dụng ở Hội sở. Chuyên viên tín dụng Hội sở nắm được thông tin và quản lý, chat và hỗ trợ chuyên viên tín dụng ở chi nhánh.

Ứng dụng thực tế kết nối giữa Laravel và Slack

Tạo app trên Slack

Kết nối thông tin giữa ứng dụng Laravel với Slack là thông qua webhook, do vậy chúng ta cần tạo ra một app trên Slack để thiết lập webhook URL.

Thêm app vào Slack

Trong trang dashboard của Slack chọn thêm ứng dụng và tìm Incoming WebHooks.

Tìm kiếm Incomming webhook

Sau khi cài đặt chúng ta có các thông tin về app trên Slack như sau:

Thông tin thiết lập app vừa cài đặt

Để kiểm tra webhook này đã hoạt động chưa, bạn có thể thực hiện gửi một request đến webhook thông qua công cụ curl

curl -X POST --data-urlencode "payload={\"channel\": \"#chatbot\", \"username\": \"All Laravel\", \"text\": \"Test thu mot thong bao den kenh #chatbot thong qua curl.\", \"icon_emoji\": \":ghost:\"}" https://hooks.slack.com/services/TXXXXXXX/BXXXXXXX/XXXXXXXXXXXXXX

Kết quả, khi vào Slack chúng ta thấy tin nhắn đã xuất hiện.

Gửi tin nhắn qua curl

Cài đặt gói Slack Notification

Các phiên bản Laravel trước 5.8.x đều được tích hợp sẵn gói Slack Notification. Ở phiên bản mới nhất là Laravel 5.8, khi muốn kết nối ứng dụng Laravel đến Slack chúng ta cần cài đặt gói Laravel Slack Notification qua Composer.

composer require laravel/slack-notification-channel

Thiết lập thông tin Slack trong ứng dụng

Thông tin cấu hình Slack sẽ được lưu toàn cục trong file cấu hình của ứng dụng Laravel, mở file .env và thêm vào:

SLACK_WEBHOOK="https://hooks.slack.com/services/TXXXXXXX/BXXXXXXX/XXXXXXXXXXXXXX"

Khi cần truy cập đến thông tin cấu hình này, có thể sử dụng cấu trúc:

env('SLACK_WEBHOOK')

Laravel 5.8 cho phép định nghĩa url này cho từng Model. Ví dụ bạn muốn định nghĩa webhook URL này cho model User:

<?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.
     *
     * @param  \Illuminate\Notifications\Notification  $notification
     * @return string
     */
    public function routeNotificationForSlack($notification)
    {
        return 'https://hooks.slack.com/services/TXXXXXXX/BXXXXXXX/XXXXXXXXXXXXXX';
    }
}

Tạo và viết code cho Notification

Tạo Notification thông qua câu lệnh artisan

php artisan make:notification SlackNotification

Khi đó một file SlackNotification.php sẽ được tạo ra trong thư mục app/Notifications. Trong Laravel có sẵn một class Illuminate\Notifications\Messages\SlackMessage để làm việc với Slack, bạn cần thêm vào phần đầu của SlackNotification:

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Messages\SlackMessage;

class SlackNotification extends Notification {

Mọi Notification class đều có phương thức via để xác định channel sẽ được sử dụng để phân phối các thông báo. Các thông báo có thể gửi đi trên các kênh mail, database, broadcast, nexmo và slack.

Do vậy, chúng ta thêm slack vào phương thức via():

   /**
     * Get the notification's delivery channels.
     *
     * @param  mixed  $notifiable
     * @return array
     */
    public function via($notifiable)
    {
        return ['mail', 'slack'];
    }

Khi đó, trong class Notification này sẽ có phương thức toSlack(), phương thức này trả về một instance của Illuminate\Notifications\Messages\SlackMessage. Tin nhắn này có thể chứa nội dung văn bản tin nhắn hoặc có thể có file đính kèm. Chúng ta cũng có thể thiết lập thông tin người gửi và người sẽ nhận tin nhắn:

/**
 * Get the Slack representation of the notification.
 *
 * @param  mixed  $notifiable
 * @return SlackMessage
 */
public function toSlack($notifiable)
{
    return (new SlackMessage)
                ->from('All Laravel')
                ->to('@here')
                ->image('https://allaravel.com/themes/allaravel/assets/img/all-laravel-logo.png')
                ->content('Tin nhắn đến từ ứng dụng All Laravel');
}

Để gửi thông báo từ ứng dụng Laravel đến Slack, chúng ta có hai cách.

Cách 1: nếu model User đã đăng ký trait Notifications thì thực hiện:

$user->notify(new SlackNotification());

Cách 2: Nếu ứng dụng không sử dụng User, có thể đăng ký gửi Notification theo cách riêng biệt sau:

Notification::route('slack', env('SLACK_WEBHOOK'))
  ->notify(new SlackNotification());

Trong ví dụ của bài viết, do để ngắn gọn chúng ta sử dụng cách hai, tạo một route để thực thi việc gửi Notification:

Route::get('/send', function() {
    Notification::route('slack', env('SLACK_WEBHOOK'))
      ->notify(new SlackNotification());
    return "Gửi tin nhắn thành công!"
});

Chạy đường dẫn /send, nếu bạn nhận được kết quả "Gửi tin nhắn thành công!", kiểm tra lại Slack sẽ thấy tin nhắn đã vào hệ thống.

Gửi tin nhắn từ Laravel đến Slack

Kết luận

Laravel và Slack kết hợp sẽ giúp bạn tạo ra những ứng dụng hữu ích, mọi các hoạt động bên các ứng dụng Laravel sẽ được cập nhật vào kênh chat chung của team trên Slack. Trong Slack còn rất nhiều các tính năng khác có thể kết hợp với Laravel như tính năng gửi tin nhắn có nội dung phức tạp Block Kit, tính năng sử dụng các câu lệnh bắt đầu bằng /. Chúng ta sẽ còn quay trở lại chủ đề này ở các bài viết khác. Có rất nhiều ý tưởng cho sự kết hợp này, chúc các bạn sử dụng hiệu quả trong công việc.

Source code: Laravel Slack Notification

Hướng dẫn chạy ứng dụng:

  1. Tải về giải nén
  2. Chạy composer update
  3. Mở file .env thay thiết lập SLACK_WEBHOOK="https://hooks.slack.com/services/DUONG_DAN_CUA_BAN" thành Webhook URL mà bạn đăng ký với Slack.

CÁC BÀI VIẾT KHÁC

FirebirD

Đam mê Toán học, Lập trình. Sở thích chia sẻ kiến thức, Phim hài, Bóng đá, Cà phê sáng với bạn bè.

Todo List: Hoàn thiện ứng dụng Todo List

0 Bình luận trong "Gửi message đến Slack chat từ ứng dụng Laravel"

Thêm bình luận