🔔

【Laravel11】SlackMessageインスタンス生成時にチャンネル指定する方法

2024/04/23に公開

使用環境

  • Laravel 11.2.0
  • PHP 8.3.4

そもそもSlack通知させるには

SlackMessageインスタンス生成時にtoメソッドを使用する方法

routeNotificationForSlackメソッドの返り値をnullにしておきます。

<?php
 
namespace App\Models;
 
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Notifications\Notification;
 
class User extends Authenticatable
{
    use Notifiable;
 
    /**
     * Route notifications for the Slack channel.
     */
    public function routeNotificationForSlack(Notification $notification): mixed
    {
        return null; // ここ
    }
}

そしたらSlackMessageインスタンス生成時にtoメソッドを使用できるようになります。

use Illuminate\Notifications\Slack\BlockKit\Blocks\ContextBlock;
use Illuminate\Notifications\Slack\BlockKit\Blocks\SectionBlock;
use Illuminate\Notifications\Slack\BlockKit\Composites\ConfirmObject;
use Illuminate\Notifications\Slack\SlackMessage;
 
/**
 * Get the Slack representation of the notification.
 */
public function toSlack(object $notifiable): SlackMessage
{
    return (new SlackMessage)
            ->to(config('services.slack.notifications.channel')) // ここ
            ->text('One of your invoices has been paid!')
            ->headerBlock('Invoice Paid')
            ->contextBlock(function (ContextBlock $block) {
                $block->text('Customer #1234');
            })
            ->sectionBlock(function (SectionBlock $block) {
                $block->text('An invoice has been paid.');
                $block->field("*Invoice No:*\n1000")->markdown();
                $block->field("*Invoice Recipient:*\ntaylor@laravel.com")->markdown();
            })
            ->dividerBlock()
            ->sectionBlock(function (SectionBlock $block) {
                $block->text('Congratulations!');
            });
}

toメソッドを使用できない場合

routeNotificationForSlackメソッドの返り値がnullじゃない場合

<?php
 
namespace App\Models;
 
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Notifications\Notification;
use Illuminate\Notifications\Slack\SlackRoute;
 
class User extends Authenticatable
{
    use Notifiable;
 
    /**
     * Route notifications for the Slack channel.
     */
    public function routeNotificationForSlack(Notification $notification): mixed
    {
        // ここでチャンネルを指定してしまっていると、toメソッドを使えない
        return SlackRoute::make($this->slack_channel, $this->slack_token);
    }
}

config/service.phpの下記部分でOAuthトークンを設定できているか確認

'slack' => [
    'notifications' => [
        // 正しく設定されてますか?
        'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'),
        'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'),
    ],
],

Discussion