Отслеживание последней активности пользователей в Laravel

Такая задача встречается довольно часто, чтобы понимать, когда наш посетитель последний раз использовал наше приложение.

Хотя в Laravel есть много способов сделать это, самый простой способ – это использовать web middlewere.

Настройка

Когда аутентифицированный пользователь посетит наше приложение, мы сохраним метку времени в базе данных для последующего использования. Давайте сохраним его в колонке под названием last_active_at.

Все что вам нужно сделать это создать миграцию:

php artisan make:migration add_last_active_at_to_users_table --table=users

И добавьте в up()метод следующую строку:

$table->timestamp('last_active_at')->nullable();

Если пользователь никогда не посещал приложение, то он останется NULL в базе данных.

Middleware

Логика

Middleware будет отвечать за проверку состояния аутентификации и обновление last_active_at.

namespace App\Http\Middleware;

use Illuminate\Http\Request;
use Closure;

class TrackLastActiveAt
{
    public function handle(Request $request, Closure $next)
    {
        if (! $request->user()) {
            return $next($request);
        }

        if (! $request->user()->last_active_at || $request->user()->last_active_at->isPast()) {
            $request->user()->update([
                'last_active_at' => now(),
            ]);
        }

        return $next($request);
    }
}

Вот что происходит по порядку:

  1. Мы проверяем, что текущий пользователь аутентифицирован. Если это не так, мы двигаемся к следующему middleware.
  2. Если текущая дата last_active_at== NULL или в прошлом, мы обновляем его, используя текущую дату и время. К счастью, Laravel имеет вспомогательную функцию now(, которая возвращает экземпляр Carbon\Carbon для текущей даты и времени.
  3. Мы двигаемся к следующему middleware.

Регистрация

У нас есть несколько различных вариантов регистрации middleware. Если вы хотите отслеживать активность ваших пользователей по всем маршрутам, она должна быть зарегистрирована под массивом web в App\Http\Kernel:

protected $middlewareGroups = [
    'web' => [
        // ...
        \App\Http\Middleware\TrackLastActiveAt::class,
    ]
]

Если вы хотите отслеживать только последние действия для определенных маршрутов, вы можете зарегистрировать middleware как часть вашего маршрута:

Route::get('/foo', 'FooController')->middleware([\App\Http\Middleware\TrackLastActiveAt::class]);

Рейтинг
( 3 оценки, среднее 5 из 5 )
Maxyc Webber/ автор статьи
Мне 35 лет. Опыт профессиональной разработки 15 лет. Занимаюсь разработкой и поддержкой корпоративных систем автоматизации бизнеса, а также высоконагруженными проектами. Мне нравится решать нестандартные проблемы бизнеса. Имею опыт формирования команд под проект, налаживания процесса разработки, коммуникации программистов и заказчиков. Есть опыт работы с зарубежными заказчиками (ОАЭ, Польша, Германия, Швейцария).
Понравилась статья? Поделиться с друзьями:
Комментарии: 6
  1. Олег

    Здравствуйте!
    Статья вероятно старая, но есть недочет, нет описания кастомного метода isPast().

    1. Maxyc Webber (автор)

      так это метод Carbon\Carbon который isPast возвращает. является ли дата в прошедшем времени

      1. Олег

        Метод такой нашёл в карбоне, спасибо.
        Но он в данном варианте не работает. Вероятно потому что last_active_at не является объектом карбона. Но я в формулировке могу ошибаться :)
        Пошёл по другому пути, обновляю время только раз в 5 минут.
        Спасибо за статью!

  2. Alex

    У меня прчему-то отказалось обновлять запись. Пришлось делать через save()

    1. Kastorsky

      Вероятно вам также необходимо внести поле “last_active_at” в вашу модель пользователей “\App\Models\User.php”

      protected $fillable = [
      // ваши имеющиеся поля
      ‘last_active_at’,
      ];
      У меня в таком варианте работает, также необходимо данный Middleware зарегистрировать последним в списке, иначе пользователь не успеет попасть в переменную $request.

  3. Alex Isin

    А еще пришлось добавить в модель “User”:
    protected $casts = [
    ‘last_active_at’ => ‘datetime’,
    ];

Добавить комментарий для Олег Отменить ответ

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.