Как создать helper в Laravel
Доброго времени суток. В одном из проектов мне нужно было реализовать авторизацию для пользователей, имеющих доступ к админке и пользователей, имеющих доступ в кабинет из разных таблиц. Как это сделать я описал в статье «Авторизация в Laravel 5.3 из нескольких таблиц». Этот способ подходит и для Laravel 5.4. Затем мне понадобилось реализовать проверку пользователя on-line. Это я описал в статье «Как проверить, что пользователь on-line в Laravel». И возник вопрос, как упростить про саму проверку в сети пользователь или нет. Было решено написать helper, который и будет решать данный вопрос.
Что такое helper в Laravel вы можете прочитать в официальной документации, а также познакомиться со стандартными helper.
И так, как вы помните из статьи «Как проверить, что пользователь on-line в Laravel» мы использовали middleware UserActivity, который помечает, что пользователь находится в сети.
<?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 был изменен:
<?php namespace App\Http\Middleware; use Closure; use Carbon\Carbon; use Auth; use Cache; class UserActivity { /** * Учет on-line пользователей * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { $expiresAt = Carbon::now()->addMinutes(5); if(Auth::guard('admin')->check()) { Cache::put('admin-is-online-' . Auth::guard('admin')->user()->id, true, $expiresAt); } if(Auth::check()) { Cache::put('user-is-online-' . Auth::user()->id, true, $expiresAt); } return $next($request); } }
Тут, думаю пояснять не надо, все очевидно.
Создание класса для helper
В каталоге App давайте создадим подкаталог Helpers. И уже в этом каталоге создадим файл Online.php, следующего содержания:
<?php namespace app\Helpers; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Cache; class Online { public static function isOnline($id,$type) { switch ($type): case 'admin': $check = Cache::has('admin-is-online-' . $id); break; case 'user': $check = Cache::has('user-is-online-' . $id); break; default: $check = false; endswitch; return $check; } }
Т.е. мы создаем класс Online и в нем создаем статический метод, который принимает параметр $id – это ID проверяемого пользователя и $type – тип пользователя: admin или user (имеет доступ к админке или к кабинету, соответственно) и возвращает true или false.
Дальше нам необходимо подключить наш helper. Для этого мы будем использовать ServiceProvider. Что такое ServiceProvider в Laravel вы можете прочитать в официальной документации
Создание ServiceProvider в Laravel
Перейдем в консоль и выполним artisan команду:
php artisan make:provider OnlineServiceProvider
Откроем его на редактирование и в метод register добавим:
require_once app_path().'/Helpers/Online.php';
Все сервис-провайдер создан. Осталось его подключить к нашему приложению.
Регистрация ServiceProvider в приложении
Для этого откроем файл основных настроек app.php, который находится в каталоге config. И в массив ‘providers’ добавим:
… App\Providers\OnlineServiceProvider::class, …
И в массив ‘aliases’ добавим:
… 'Online' => App\Helpers\Online::class, …
Сохраняем.
Теперь мы можем использовать наш хелпер в любом месте приложения. Вызвав
Online::isOnline($user->id,'admin')
Вот, как это выглядит у меня.
Заключение.
Мы с вами создали собственный helper в Laravel. Затем подключили его к Laravel используя созданный ServiceProvider.
Thank you very much!