在 Laravel 中每次状态更改时发送 Slack 通知

Send Slack notification every time a Status is changed in Laravel

我有一个状态通知 class,因此在创建状态时它会向我发送一个 slack message.The 我 运行 遇到的问题是每次都会创建一个新状态几分钟并每隔几分钟收到一条松弛消息是重复的和非建设性的。特别是因为有数十台服务器 post 处理这些状态。

如果特定服务器状态发生变化,是否有办法仅 post 松弛消息?例如服务器启动然后关闭。

我试过获取所有服务器状态,但无法弄清楚如何只获取最后两个具有特定服务器 ID 的状态。

-------------------------------------------- ----------编辑------------------------------------ ---------------------- 以前尝试过的尝试:除了最后一个我不想在那里

 $statuses = ServerStatus::all();
    $first = ServerStatus::where('server_id', $notifiable->server_id)->first();
    //dump($first);

    foreach($statuses as $status){
        if($status->server_id === $notifiable->server_id){
            //dump($status);
            if($status->status_id !== $first->status_id){
                return (new SlackMessage)
                    ->content('One of your statuses has been updated!');
            }
            else{
                return (new SlackMessage)
                    ->content('One of your statuses has been not updated!');
            }
        }
    }

也是我每次创建 ServerStatus 时发送通知的引导程序:

受保护的静态函数 boot(){

    parent::boot();

    ServerStatus::created(function($model) {

        $original = ServerStatus::where('server_id', $model->server_id)->skip(1)->first();

        dump('original',$original->status_id);
        dump('serverStatus', $model->status_id);

        if ($original && $model->status_id != $original->status_id) {
            $model->notify(new ServerStatusNotification());
        }
    });
}

我会在您的 ServerStatus 模型的引导功能中绑定到 updating 事件,以便您可以进行 isDirty 比较。您可以调用 isDirty('status_id') 来确定状态 id 是否已更改,如下所示:

protected static function boot() 
{

    parent::boot();

    ServerStatus::created(function(ServerStatus $serverStatus) {
        $original = ServerStatus::where('server_id', $serverStatus->server_id)->last();
        if ($original && $serverStatus->status_id !== $original->status_id) {
            // send slack notification, status id differs
        }
    });
}

如果您需要对特定状态进行更多控制,可以调用getOriginal()获取原始值并确定,例如您的情况,特定状态转换:

ServerStatus::created(function(ServerStatus $serverStatus) {
    $original = ServerStatus::where('server_id', $serverStatus->server_id)->last();

    if ($original && $original->status->description === 'up' && $serverStatus->status->description === 'down') {
        //send server went down notification
    } else if ($original && $original->status->description === 'down' && $serverStatus->status->description === 'up') {
        //send server is up notification
    }
});

我实际上并不知道您的关系名称是什么,也不知道存储 status 文本版本的列是什么,但是像上面这样的内容应该适合您。