Рубрики
Uncategorized

Laravel — знание того, когда ваши пользователи в последний раз были онлайн

Laravel — знание того, когда ваши пользователи в последний раз были онлайн Эта статья является частью серии, в которой… С тегами php, аналитика, база данных, laravel.

Laravel — знание того, когда ваши пользователи в последний раз были онлайн

Эта статья является частью серии, в которой я документирую идеи, изменения и переосмысление, которые я испытал во время рефакторинга кодовой базы для Pulse — безболезненного и доступного инструмента мониторинга сайтов и серверов, предназначенного для разработчиков.

Сегодня я расскажу о том, как я добавил функциональность промежуточного программного обеспечения для записи того, когда пользователь в последний раз был в Сети/использовал приложение. Я хотел добавить это в Pulse для некоторых аналитических вопросов, на которые мне нужно было ответить.

Подготовка базы данных

Если мы хотим записать, когда пользователь в последний раз был в Сети, то для этой цели нам потребуется добавить метку времени в таблицу пользователей. Это простой шаг, поэтому мы начнем с этого. Вставьте следующее в миграцию таблицы пользователей:

$table->timestamp("last_online_at")->useCurrent();

Затем мы хотим, чтобы Laravel распознал этот атрибут как экземпляр Carbon, чтобы мы могли воспользоваться его обширным набором функций даты и времени. Итак, в нашем классе модели пользователя мы добавим его в массив $casts:

class User
{
    protected $casts = ["last_online_at" => "datetime"];
}

Добавление логики в приложение

Поскольку мы хотим иметь возможность устанавливать/обновлять это значение из любой потенциальной точки входа в приложение, идеальным местом для хранения логики является класс промежуточного программного обеспечения. Итак, давайте продолжим и создадим его:

namespace App\Http\Middleware;

use DB;
use Closure;

class LastOnlineAt
{
    public function handle($request, Closure $next)
    {
        if (auth()->guest()) {
            return $next($request);
        }

        if (auth()->user()->last_online_at->diffInHours(now()) !== 0)
        { 
            DB::table("users")
              ->where("id", auth()->user()->id)
              ->update(["last_online_at" => now()]);
        }

        return $next($request);
    }
}

Здесь происходит довольно много всего, так что давайте разберем это…

  1. Сначала мы проверяем, является ли пользователь гостем. Если это так, мы продолжаем, так как не можем установить метку времени для гостевого пользователя.
  2. Если пользователь аутентифицирован, мы получаем его последнюю онлайн-метку времени.
  3. Затем мы определяем, является ли эта временная метка старше часа (эту проверку я добавил, чтобы избежать обновления базы данных при каждом запросе, но вы можете установить эту проверку на все, что захотите, или полностью удалить ее).
  4. Предполагая, что разница во времени превышает один час, мы обновляем метку времени в базе данных с текущим временем.
  5. Независимо от того, был ли выполнен шаг 4, затем мы продолжаем выполнять запрос пользователя (каким бы он ни был).

Возможно, вам интересно, почему я просто не обновил аутентифицированного пользователя напрямую вместо использования фасада БД?

Что ж, если мы обновим саму модель, это приведет к запуску событий, а также установит метку времени updated_at на текущее время. Технически запись пользователя на самом деле не обновлялась как таковая, мы просто установили время, когда они в последний раз были в Сети. В результате я считаю, что использование фасада БД является лучшим вариантом.

Заключительный шаг

Все, что нам остается, – это дать указание Laravel использовать промежуточное программное обеспечение. Мы делаем это в рамках HTTP-ядра приложения. Просто добавьте класс в массивы web и api в свойстве группы промежуточного программного обеспечения $ напр.

protected $middlewareGroups = [
    "web" => [LastOnlineAt::class],
    "api" => [LastOnlineAt::class],
];

Теперь всякий раз, когда аутентифицированный пользователь посещает веб-маршрут или маршрут api, Laravel устанавливает отметку времени last_online_at. Аккуратно!

Завершая

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

Наконец, если вы ищете доступный и безболезненный инструмент мониторинга сайтов и серверов, который не требует от вас степени DevOps, пожалуйста, найдите минутку, чтобы проверить Pulse . Я думаю, вы найдете это глотком свежего воздуха!

Еще раз спасибо и счастливого кодирования!

Оригинал: “https://dev.to/mattkingshott/laravel-knowing-when-your-users-were-last-online-48lf”