Отслеживание последней активности пользователей в 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 )
Максим Гречушников/ автор статьи
Мне 40 лет, и больше половины жизни я занимаюсь разработкой. За это время я работал с корпоративными системами, highload-проектами, интеграциями, платежными решениями, внутренними платформами и legacy-кодом, который пережил не одного разработчика. Некоторые системы, кажется, переживут и нас. Моя специализация — PHP, Laravel, backend-архитектура, DDD, тестирование, рефакторинг и техническое лидерство. Мне интересны задачи, где нужно соединить код, бизнес, данные, процессы и здравый смысл. Последние годы я много работаю с LLM и AI-инструментами: использую их для проектирования, анализа кода, документации, тестов, ревью, работы с legacy и построения инженерных процессов. Для меня LLM — это не замена разработчику, а усилитель для тех, кто умеет думать системно. В блоге я пишу о Laravel, PHP, архитектуре, тестировании, инженерной практике, управлении разработкой и реальном применении AI в работе программиста.
Понравилась статья? Поделиться с друзьями:
Комментарии: 6
  1. Олег

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

  2. Максим Гречушников (автор)

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

  3. Олег

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

  4. Alex

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

  5. Kastorsky

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

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

  6. Alex Isin

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

Комментарии закрыты.