Đang tải...

Cách gửi tin nhắn từ Laravel đến Slack (phiên bản 2024)

Trong hướng dẫn này, tôi sẽ chỉ cho bạn cách thiết lập webhooks Slack đến và định cấu hình nó trong Laravel.

Nhiều công ty đang sử dụng Slack làm công cụ giao tiếp chính của họ. Tin tôi đi, sẽ chỉ là vấn đề thời gian trước khi bạn được yêu cầu tích hợp Slack với Laravel 😉 Điều này cũng sẽ phù hợp nếu bạn muốn tích hợp những thứ như thông báo Laravel Horizon hoặc Spatie Health.

Gửi tin nhắn từ Slack đến các kênh của bạn sẽ yêu cầu hai điều:

  1. Thiết lập webhooks đến (theo cách hiện đại, không cần sử dụng ứng dụng "incoming webhooks")
  2. Gửi tin nhắn từ Laravel

1. Tạo ứng dụng Slack và thiết lập các webhooks đến

Bước đầu tiên là tạo webhook trên Slack. Về cơ bản, webhook là một URL mà bạn có thể gửi tin nhắn đến và những tin nhắn đó sẽ xuất hiện trong các kênh Slack được chỉ định.

Nhiều hướng dẫn khuyên bạn nên sử dụng plugin "incoming webhooks" cũ và không còn được dùng nữa. Cả Slack và plugin đó đều nói rằng plugin đó không được dùng nữa, vì vậy sử dụng plugin đó sẽ không phải là giải pháp lâu dài tốt. Vì vậy, chúng tôi sẽ đi theo con đường chính thức.

  1. Truy cập https://api.slack.com/apps và nhấp vào Tạo ứng dụng.
  2. Một cửa sổ bật lên sẽ mở ra nơi bạn có thể chọn loại ứng dụng. Tôi sẽ chọn Từ đầu vì chúng tôi sẽ chỉ xây dựng một ứng dụng đơn giản.
  3. Tiếp theo, bạn sẽ được yêu cầu thêm tên và chọn không gian làm việc. Nếu bạn không thấy không gian làm việc mình muốn, hãy thử đăng xuất khỏi tất cả các không gian làm việc và đăng nhập lại vào không gian làm việc mà bạn muốn sử dụng. Tiếp theo, làm mới trang gốc và kiểm tra xem hiện tại có thể chọn không gian làm việc hay không.

Tiếp theo, nhấp vào Incoming webhooks.

Tiếp theo, bật tính năng này bằng cách sử dụng nút chuyển và nhấp vào Thêm webhook mới vào không gian làm việc. Thao tác này sẽ đưa bạn đến màn hình nơi bạn có thể chọn kênh. Chọn kênh bạn muốn và tạo webhook. Bộ lặp cho mọi kênh để gửi webhook tới.

Cuối cùng, bạn sẽ có một màn hình như thế này:

2. Gửi tin nhắn Slack từ Laravel

Tiếp theo là phần thú vị: thực sự gửi tin nhắn tới Slack. ✨ Bạn có thể làm điều này trong hai bối cảnh:

  1. Các gói chỉ yêu cầu URL webhook của Slack và tự xử lý việc gửi (như Laravel Horizon).
  2. Gửi thông báo tùy chỉnh đến không gian làm việc Slack của bạn.

Để sử dụng cùng một webhook cho cả hai, tôi khuyên bạn nên tạo khóa cấu hình cho mỗi webhook hay còn gọi là mỗi kênh trong config/services.php:

'slack' => [
    'general' => env('SLACK_GENERAL_WEBHOOK_URL'),
    'announcements' => env('SLACK_ANNOUNCEMENTS_WEBHOOK_URL'),
    'tech-dev-ops' => env('SLACK_TECH_DEV_OPS_WEBHOOK_URL'),
],

Tiếp theo, hãy đảm bảo thêm các biến .env chính xác vào production.

Thiết lập thông báo Slack cho các gói

Điều đầu tiên chúng ta sẽ làm là thiết lập thông báo Slack cho các gói và công cụ tự xử lý việc gửi. Trong ví dụ này, chúng tôi sẽ sử dụng Laravel Horizon.

Trong phương thức `boot()` của nhà cung cấp dịch vụ, chúng ta có thể đăng ký webhook cho thông báo Laravel Horizon Slack:

if ($slackWebhookTechDevOps = config('services.slack.shipping-dev-ops')) {
    Horizon::routeSlackNotificationsTo($slackWebhookTechDevOps);
}

Tất cả chỉ có vậy thôi! Chúng ta chỉ cần cung cấp webhook là xong.

Nếu có trường hợp bạn cần cung cấp webhook thông qua cấu hình khác, bạn chỉ cần tham chiếu biến .env chính xác ở đó:

// config/some-package.php
'notifications' => [
    'slack' => [
        'webhook' => env('SLACK_TECH_DEV_OPS_WEBHOOK_URL'),
    ],
],

Tự gửi thông báo Slack tùy chỉnh

Tiếp theo là tự mình gửi thông báo Slack tùy chỉnh. Laravel hỗ trợ rất tốt việc gửi thông báo Slack nâng cao trong thông báo. Tuy nhiên, đối với thông báo, chúng ta cũng cần người nhận để gửi tới? Đó có thể là quản trị viên hoặc người dùng quan trọng khác, nhưng vì chúng ta đang nói về Slack Workspace thay vì người dùng, sẽ hợp lý hơn nếu tạo một đối tượng có thể thông báo tùy chỉnh mà chúng ta có thể sử dụng để gửi thông báo tới.

Để làm điều đó, bạn có thể tạo một tập tin mới trong `app/Notifications/SlackNotifiable.php` hoặc bất cứ nơi nào bạn muốn và thêm đoạn mã sau:

<?php
 
namespace App\Notifications;
 
use Illuminate\Notifications\Notifiable;
 
class SlackNotifiable
{
    use Notifiable;
 
    public function routeNotificationForSlack(): string
    {
        return config('services.slack.general');
    }
}

Tiếp theo, tạo thông báo kiểm tra trong `app/Notifications/TestNotification.php` với nội dung sau:

<?php
 
namespace App\Notifications;
 
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\SlackMessage;
use Illuminate\Notifications\Notification;
 
class TestNotification extends Notification implements ShouldQueue
{
    public function via(): array
    {
        return ['slack'];
    }
 
    public function toSlack(): SlackMessage
    {
        return (new SlackMessage())
            ->success()
            ->content('Hello world from Laravel!');
    }
}

Tiếp theo, gửi nó như thế này:

(new SlackNotifiable())->notify(new TestNotification());

Như bạn có thể thấy, điều này rất dễ dàng! Để tìm hiểu cách định dạng tin nhắn của mình, bạn có thể tham khảo tài liệu chính thức của Laravel cho Slack.

 

Gửi thông báo Slack đến các kênh tùy chỉnh

Điều cuối cùng mà chúng ta cần thảo luận là cách gửi thông báo đến các kênh khác nhau. Ý tưởng cơ bản là chỉ cần trao đổi url webhook này với url khác. Bạn có thể làm điều đó bằng cách thêm câu lệnh `match()` trong lớp `SlackNotibility`:

class SlackNotifiable
{
    use Notifiable;
 
    public function routeNotificationForSlack(Notification $notification): string
    {
        return match ($notification::class) {
            UserCreatedNotification::class => config('services.slack.announcements'),
            default => config('services.slack.general'),
        };
    }
}

Nếu bạn không thích đặt logic cho tên kênh bên trong lớp `SlackNotifiable` bạn cũng có thể làm điều đó bằng cách thêm phương thức `getSlackChannel()` vào mỗi Slack-notification:

class SlackNotifiable
{
    use Notifiable;
 
    public function routeNotificationForSlack(Notification $notification): string
    {
        return config('services.slack.' . $notification->getSlackChannel());
    }
}

 

Kết thúc

Như bạn có thể thấy, việc gửi thông báo Slack đến không gian làm việc tùy chỉnh không hề khó khăn chút nào. Nó chỉ yêu cầu thiết lập phù hợp và hiểu biết cơ bản về cách hoạt động của webhooks Slack. Tôi hy vọng bài viết này hữu ích và giúp bạn tiết kiệm thời gian tìm hiểu vấn đề này 😀