Такая задача встречается довольно часто, чтобы понимать, когда наш посетитель последний раз использовал наше приложение.
Хотя в 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);
}
}
Вот что происходит по порядку:
- Мы проверяем, что текущий пользователь аутентифицирован. Если это не так, мы двигаемся к следующему middleware.
- Если текущая дата
last_active_at
==NULL
или в прошлом, мы обновляем его, используя текущую дату и время. К счастью, Laravel имеет вспомогательную функциюnow(
, которая возвращает экземплярCarbon\Carbon
для текущей даты и времени. - Мы двигаемся к следующему 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]);
Здравствуйте!
Статья вероятно старая, но есть недочет, нет описания кастомного метода isPast().
так это метод Carbon\Carbon который isPast возвращает. является ли дата в прошедшем времени
Метод такой нашёл в карбоне, спасибо.
Но он в данном варианте не работает. Вероятно потому что last_active_at не является объектом карбона. Но я в формулировке могу ошибаться
Пошёл по другому пути, обновляю время только раз в 5 минут.
Спасибо за статью!
У меня прчему-то отказалось обновлять запись. Пришлось делать через save()
Вероятно вам также необходимо внести поле “last_active_at” в вашу модель пользователей “\App\Models\User.php”
protected $fillable = [
// ваши имеющиеся поля
‘last_active_at’,
];
У меня в таком варианте работает, также необходимо данный Middleware зарегистрировать последним в списке, иначе пользователь не успеет попасть в переменную $request.
А еще пришлось добавить в модель “User”:
protected $casts = [
‘last_active_at’ => ‘datetime’,
];