每次在laravel中更改状态时发送slack通知

oknwwptz  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(352)

我有一个状态通知类,因此当创建一个状态时,它会向我发送一条松弛消息。我遇到的问题是,每隔几分钟创建一个新状态,每隔几分钟获取一条松弛消息是重复的和非结构化的。尤其是因为有几十个服务器发布这些状态。
如果特定的服务器状态已更改,是否有办法只发布slack消息?e、 服务器启动后又停机。
我试过获取所有的服务器状态,但不知道如何只获取具有特定服务器id的最后两个。

vuv7lop3

vuv7lop31#

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

$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());
        }
    });
}

5t7ly7z5

5t7ly7z53#

我会绑在 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 是的,但是像上面这样的东西应该适合你。

相关问题