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

时间:2018-06-07 12:45:36

标签: php mysql laravel slack-api

我有一个状态通知类,所以当创建状态时它会向我发送一条松弛的消息。我遇到的问题是每隔几分钟就会创建一个新状态,并且每隔几分钟就会重复发送一条松弛消息和非建设性的。特别是因为有数十台服务器发布了这些状态。

如果特定服务器状态发生了变化,是否只能发布松弛消息?例如服务器上升然后下降。

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

----------------------------------------------- ---------- EDITS --------------------------------------- --------------------- 以前试过的尝试:除了我不想要的最后一个

 $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时发送通知的引导:

protected static function 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());
        }
    });
}

enter image description here

1 个答案:

答案 0 :(得分:2)

我会绑定到updating模型的启动功能中的ServerStatus事件,以便您进行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文本版本的列是什么,但上述内容应该对您有用。