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);
}
}
Здесь происходит довольно много всего, так что давайте разберем это…
- Сначала мы проверяем, является ли пользователь гостем. Если это так, мы продолжаем, так как не можем установить метку времени для гостевого пользователя.
- Если пользователь аутентифицирован, мы получаем его последнюю онлайн-метку времени.
- Затем мы определяем, является ли эта временная метка старше часа (эту проверку я добавил, чтобы избежать обновления базы данных при каждом запросе, но вы можете установить эту проверку на все, что захотите, или полностью удалить ее).
- Предполагая, что разница во времени превышает один час, мы обновляем метку времени в базе данных с текущим временем.
- Независимо от того, был ли выполнен шаг 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”