Как проверить, что пользователь on-line в Laravel
Доброго времени суток. В этой статье мы рассмотрим, как проверить, что пользователь находится на сайте. Для этого мы будем использовать middleware и кэш. Мы создадим middleware и рассмотрим примеры работы с cache в Laravel. Также настроим авторизацию и регистрацию пользователей. Ну, что поехали…
У нас есть установленный Laravel версии 5.4 (это последняя версия Laravel на момент написания статьи), который находится по адресу http://pagination.loc/ (в моем случае).
Есть база данных и Laravel настроен для подключения к данной базе.
Настройка авторизации в Laravel
Первое, что нам необходимо сделать это запустить миграцию, выполнив в консоли следующую команду:
php artisan migrate
Перед выполнением этой команды необходимо отредактировать файл миграций 2014_10_12_000000_create_users_table.php, который расположен в database\migrations\
Строку
$table->string('email')->unique();Заменить на
$table->string('email',100)->unique();
Отлично команда выполнена.
Теперь нужно создать роуты, для этого выполняем следующую команду:
php artisan make:auth
Команда выполнена
Теперь можно проверить. Перейдем на наш сайт, в моем случае http://pagination.loc/ и видим, что у нас появились две ссылки: на страницу авторизации и страницу регистрации.
Давайте перейдем на страницу регистрации и зарегистрируем нового пользователя.
Например:
- Name: Test-1
- E-Mail Address: test1@mail.ru
- Password: 123456
- Confirm Password: 123456
Выходим
И регистрируем второго пользователя. Все аналогично.
Вывод пользователей
Теперь нам необходимо в методе index контроллера HomeController добавить вывод пользователей. Открываем контроллер HomeController редактируем код:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\User; class HomeController extends Controller { /** * Create a new controller instance. * * @return void */ public function __construct() { $this->middleware('auth'); } /** * Show the application dashboard. * * @return \Illuminate\Http\Response */ public function index() { $users = User::all(); return view('home',['users'=>$users]); } }
Теперь во вьюхе надо добавить вывод пользователей. Открываем файл home.blade.php и изменяем код:
@extends('layouts.app') @section('content') <div class="container"> <div class="row"> <div class="col-md-8 col-md-offset-2"> <div class="panel panel-default"> <div class="panel-heading">Dashboard</div> <div class="panel-body"> You are logged in! </div> <div class="panel-body"> <table width="100%"> <tr> <td width="30%">В сети</td> <td width="70%">Email</td> </tr> @foreach($users as $user) <tr> <td></td> <td>{{ $user->email }}</td> </tr> @endforeach </table> </div> </div> </div> </div> </div> @endsection
Проверяем, что получилось:
Отлично. Теперь нам надо создать middleware, который будет отслеживать активность пользователя.
Создание middleware
Для создания middleware запустим в консоле следующую команду:
php artisan make:middleware UserActivity
Открываем только, что созданный middleware и изменяем код:
<?php namespace App\Http\Middleware; use Closure; use Carbon\Carbon; use Auth; use Cache; class UserActivity { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { if(Auth::check()) { $expiresAt = Carbon::now()->addMinutes(5); Cache::put('user-is-online-' . Auth::user()->id, true, $expiresAt); } return $next($request); } }
Теперь этот middleware необходимо добавить в kernel в свойство $middlewareGroups
protected $middlewareGroups = [ 'web' => [ … \App\Http\Middleware\UserActivity::class, … ]
Теперь наш middleware будет выполняться при любом запросе к web.
Проверка пользователя на on-onine
Открываем модель User и добавляем следующий метод:
public function isOnline() { return Cache::has('user-is-online-' . $this->id); }
Сохраняем. Теперь нам необходимо отредактировать вьюху, для отображения on-line пользователей.
Редактирование отображения.
Открываем home.blade.php и редкатируем:
@extends('layouts.app') @section('content') <div class="container"> <div class="row"> <div class="col-md-8 col-md-offset-2"> <div class="panel panel-default"> <div class="panel-heading">Dashboard</div> <div class="panel-body"> You are logged in! </div> <div class="panel-body"> <table width="100%"> <tr> <td width="30%">В сети</td> <td width="70%">Email</td> </tr> @foreach($users as $user) <tr> <td> @if($user->isOnline()) <span style="color:green">В сети</span> @else <span style="color:red">Не в сети</span> @endif </td></pre> <td>{{ $user->email }}</td> <pre> </tr> @endforeach </table> </div> </div> </div> </div> </div> @endsection
Проверяем.
Проходим авторизацию под первыйм пользователем test1@mail.ru
И видим, что первый пользователь находится online, а второй – нет.
Переопределение метода logout
Теперь если пользователь разлогинется, то наша система будет показывать, что он находится в on-line еще в течении минут, т.к. в кэше будут хранится его данные. Это не очень хорошо. Давайте переопределим метод logout контроллера LoginController и при выходе пользователя удалим из кэша его данные. Открываем файл LoginController.php и добавляем в него следующий код:
<?php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\AuthenticatesUsers; use Cache; use Auth; class LoginController extends Controller { /* |-------------------------------------------------------------------------- | Login Controller |-------------------------------------------------------------------------- | | This controller handles authenticating users for the application and | redirecting them to your home screen. The controller uses a trait | to conveniently provide its functionality to your applications. | */ use AuthenticatesUsers; /** * Where to redirect users after login. * * @var string */ protected $redirectTo = '/home'; /** * Create a new controller instance. * * @return void */ public function __construct() { $this->middleware('guest', ['except' => 'logout']); } public function logout() { Cache::forget('user-is-online-' . Auth::user()->id); Auth::logout(); return redirect(''); } }
Проверяем
Заключение
Мы с вами настроили проверку активности пользователя на сайте, используя middleware. Наш middleware запускается при каждом запросе к сайту и проверяет авторизован ли пользователь. И если пользователь авторизован, то записывает его параметры в кэш. Так же мы с вами переопределили метод logout контроллера LoginController, теперь при выходе пользователя удаляется из кэш его данные.
А в следующей статье мы рассмотрим как в Laravel организовать модульность.
Чтобы не пропустить выхода новых статей подписываемя: VK, twitter, facebook. И канал на youtube
Так себе статья. Многое не объясняется зачем выполнять определенные действия. А вообще, некоторые другие статьи очень помогли в освоении Ларавел.
а при закрытии браузера как логаут работать будет?
По таймауту сессия слетит