DevGang
Авторизоваться

Laravel: устанавливаем отметку времени последнего посещения пользователя

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

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

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

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

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

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

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

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

namespace App\Http\Middleware;use DB;
use Closure;

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

        if ($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, мы затем продолжаем работу с запросом пользователя (каким бы он ни был).

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

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

Последний шаг

Нам остается только поручить Laravel использовать наш класс LastOnlineAt. Мы делаем это в ядре HTTP приложения. Просто добавьте класс к web и api массивы в $middlewareGroups, например:

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

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

#PHP #Laravel
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться