Как проверить, что пользователь on-line в Laravel

Ромчик
0

Проверка пользователя на сайте LaravelДоброго времени суток. В этой статье мы рассмотрим, как проверить, что пользователь находится на сайте. Для этого мы будем использовать middleware и кэш. Мы создадим middleware и рассмотрим примеры работы с cache в Laravel. Также настроим авторизацию и регистрацию пользователей. Ну, что поехали…

У нас есть установленный Laravel версии 5.4 (это последняя версия Laravel на момент написания статьи), который находится по адресу http://pagination.loc/  (в моем случае).

Сайт на Laravel

Есть база данных и Laravel настроен для подключения к данной базе.

Настройка авторизации в Laravel

Первое, что нам необходимо сделать это запустить миграцию, выполнив в консоли следующую команду:

php artisan migrate

Перед выполнением этой команды необходимо отредактировать файл миграций 2014_10_12_000000_create_users_table.php, который расположен в database\migrations\

Строку


$table->string('email')->unique();

Заменить на


$table->string('email',100)->unique();

Отлично команда выполнена.

Выполнение миграции в Laravel

Теперь нужно создать роуты, для этого выполняем следующую команду:


php artisan make:auth

Команда выполнена

Создание аутентификации в Laravel

Теперь можно проверить. Перейдем на наш сайт, в моем случае http://pagination.loc/ и видим, что у нас появились две ссылки: на страницу авторизации и страницу регистрации.

Аутентификация в Laravel

Давайте перейдем на страницу регистрации и зарегистрируем нового пользователя.Страница регистрации в Laravel

Например:

  • Name: Test-1
  • E-Mail Address: test1@mail.ru
  • Password: 123456
  • Confirm Password: 123456

Выходим

logout

И регистрируем второго пользователя. Все аналогично.

Вывод пользователей

Теперь нам необходимо в методе 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 в Laravel

Открываем только, что созданный 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

Список on-line пользователей в Laravel

И видим, что первый пользователь находится 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
Понравилась статья? Поделись с друзьями.
  • Add to favorites
  • Добавить ВКонтакте заметку об этой странице
  • Twitter
  • Facebook
  • Мой Мир
  • LiveJournal
  • Одноклассники
  • Блог Я.ру
  • MySpace
  • FriendFeed
  • В закладки Google
  • Google Buzz
  • Яндекс.Закладки
  • Reddit
  • StumbleUpon
  • Technorati
  • del.icio.us
  • БобрДобр
  • LinkedIn
  • Memori.ru
  • Сто закладок
  • Blogger
©2012-2017 По всем вопросам обращайтесь через форму обратной связи

Яндекс.Метрика