Отправлять уведомление Slack каждый раз при изменении статуса в Laravel

У меня есть класс уведомлений о статусе, поэтому при создании статуса он отправляет мне сообщение о резерве. Проблема, с которой я сталкиваюсь, заключается в том, что новый статус создается каждые несколько минут, а получение сообщения о резерве каждые пару минут является повторяющимся и неконструктивным. Тем более, что таких статусов публикуют десятки серверов.

Будет ли способ отправить сообщение о резерве только в том случае, если изменился статус конкретного сервера? например сервер был запущен, затем отключился.

Я пробовал получить все статусы сервера, но не могу понять, как получить только последние два с определенным идентификатором сервера.

-------------------------------------------------- ------- РЕДАКТИРОВАНИЕ ------------------------------------------ ------------------ Попытка, сделанная ранее: кроме последней, я бы там не хотел

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

Отправлять уведомление Slack каждый раз при изменении статуса в Laravel

Конечно - получите предыдущий статус и сравните его.

ceejayoz 07.06.2018 14:48

Я не уверен, как здесь помогает миграция. Вы не показали, как инициируется уведомление. Почему бы вам просто не запросить в классе уведомлений, соответствует ли последний статус, если это так, не отправляйте уведомление.

Devon 07.06.2018 14:49

Могу ли я использовать pluck для получения предыдущего статуса, потому что, когда я запускал dd (ServerStatus :: pluck ('server_id', 'status_id')), он возвращал только самое последнее состояние каждого сервера. Это затем перезаписывается новым состоянием и практически бесполезно для меня? верный? (Довольно новичок в laravel в целом, извините, если это звучит тривиально)

Striker 07.06.2018 14:52

Это должен быть довольно простой запрос. Если вы пытаетесь использовать выщипывание без каких-либо условий, я думаю, вам есть чем заняться. Предлагаю вам прочитать Laravel.com/docs. Это очень хорошо задокументировано.

Devon 07.06.2018 14:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
221
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я бы привязал к событию updating в функции загрузки вашей модели ServerStatus, чтобы вы могли сравнить isDirty. Вы можете вызвать в isDirty('status_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, но что-то вроде приведенного выше должно сработать для вас.

Большое вам спасибо, я пытался реализовать большую часть своей логики в самом классе уведомлений, так что это мне очень помогло! После реализации первого, я вообще не получаю никаких сообщений о бездействии, я постараюсь снять некоторые и дам вам знать.

Striker 07.06.2018 16:56

Будет ли это работать, даже если они создают новую модель каждый раз при обновлении статуса? Не просто обновление записи в базе данных?

Striker 07.06.2018 17:03

@Striker Значит, новая модель ServerStatus создается каждый раз при обновлении статуса? В таком случае это вообще не сработает, потому что оригинала не было, и isDirty каждый раз выходил из строя. Вам нужно будет получить предыдущий ServerStatus в функции creating вместо «обновления».

Ohgodwhy 07.06.2018 17:09

Да, каждый раз создается новый ServerStatus. Я прикрепил то, что пробовал ранее, вероятно, это не так, но я подумал, что это может помочь.

Striker 07.06.2018 17:12

@Striker Обновлено, это может быть вам более полезно

Ohgodwhy 07.06.2018 17:19

Я даю этому шанс, вы уверены, что он последний (), не будет ли он первым (). Я изменил его на first and die и сбросил обе переменные, заметив, что он отправляет сообщение каждый раз, когда я все еще создавал. Что было странно, так это $serverStatus->status_id и $original->status_id, оба были 2, просто статус сервера был строкой, а исходным - int.

Striker 07.06.2018 17:29

добавил фото dd и то, что у меня сейчас есть для загрузки

Striker 07.06.2018 17:40

получил это работает! завершенная версия добавлена ​​выше!

Striker 07.06.2018 17:59

Другие вопросы по теме