Автор оригинала: David Wong.
Статья была переслана из профессионального сообщества разработчиков laravel. Оригинальная ссылка: https://learnku.com/laravel/t
Сегодня моя задача-добавить зеленую точку рядом с именем пользователя на странице профиля пользователя приложения laravel, чтобы указать, находятся ли они в сети или нет. Первое, о чем я думаю, это то, что нам нужно будет запустить узел. JS-сервер и отслеживание активных подключений к сокетам каждого пользователя. Затем с помощью текущего сокета пользователя для входа в систему мы можем обновлять онлайн-статус в режиме реального времени! Единственная проблема заключается в том, что это наше текущее требование, немного завышенное, и оно не является полностью необходимым до тех пор, пока нашей функции не потребуется достичь второй точности, такой как чат в реальном времени.
Один коллега отметил, что того, как MySpace работает с “онлайн” функциями, может быть достаточно для текущих потребностей. Насколько нам известно, способ, которым MySpace показывает, находятся ли пользователи в Сети, основан на их последней активности на сайте. Если их последнее действие происходит в течение X минут, мы отобразим значок “онлайн”, если нет, мы этого не сделаем. Все просто!
Давайте добавим поле в таблицу пользователей для последнего действия пользователя и обновим его при запросе каждой страницы. Затем, когда нам нужно проверить, находятся ли пользователи в Сети, мы можем сравнить метку времени с текущей меткой времени. Если в течение X минут они будут в сети! Хотя это работает хорошо, в зависимости от приложения, которое вы создаете, это добавит ненужную Запись в , что в некоторой степени замедлит работу вашего приложения. Хорошим компромиссом является хранение этой информации в кэше приложения.Преимущество кэширования заключается в том, что его можно упростить, поскольку вы можете установить срок действия кэша.
Теперь, когда мы решили реализовать эту функцию с помощью кэширования, следующий вопрос заключается в том, где должен выполняться этот код, чтобы он выполнялся при каждом запросе? У меня есть две идеи:
- Создайте базовый контроллер и позвольте всем вашим контроллерам унаследовать его
- Создание промежуточного программного обеспечения
После некоторых размышлений и осознания того, что мне нужно добавить вызов родительского конструктора во все написанные мной конструкторы, я решаю реализовать его в промежуточном программном обеспечении.
У нас есть план, давайте введем код!
Во-первых, нам нужно создать промежуточное программное обеспечение. Введите следующую команду в терминале:
php artisan make:middleware LogLastUserActivity
Далее мы открываем следующий PHP-файл app/Http/Middleware/LogLastUserActivity.php. Добавьте следующий код в метод дескриптора:
if(Auth::check()) {
$expiresAt = Carbon::now()->addMinutes(5);
Cache::put('user-is-online-' . Auth::user()->id, true, $expiresAt);
}
Далее мы открываем приложение/HTTP/kernel.php досье. Если вы используете laravel 5.1 или более раннюю версию, вам следует поместить код непосредственно в $промежуточное программное обеспечение Массив, если ваша версия 5.2. *, *, вы должны поместить код в $группы промежуточного программного обеспечения В сети. Обязательно введите код в Начало сеанса Под промежуточным программным обеспечением, в противном случае портал аутентификации не будет корректно входить в систему пользователя. Мои параметры конфигурации обновления следующие:
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class
\App\Http\Middleware\VerifyCsrfToken::class,
\App\Http\Middleware\LogLastUserActivity::class,
],
'api' => [
'throttle:60,1',
],
];
Последний шаг-добавить метод в наш пользовательский объект для определения значения. В ПРИЛОЖЕНИИ/user.php, мы добавляем следующие методы:
public function isOnline()
{
return Cache::has('user-is-online-' . $this->id);
}Теперь вы можете добавить следующие методы на любую страницу:
@if($user->isOnline())
user is online!!
@endif
Важный – обязательно используйте use в верхней части вашего файла, чтобы включить все фасады!
Я надеюсь, что вышесказанное поможет вам решить эту проблему!
Оригинал: “https://developpaper.com/laravel-uses-a-simple-way-to-track-whether-users-are-online/”