Очень хорошо протестировано, оптимизировано и готово к производству!
Мы устранили множество complexity
за кулисами, чтобы предоставить вам большую simplicity
.
Интегрировано с пакетом laravel-debugbar из коробки: laravel debugbar
composer require imanghafoori/laravel-heyman
PHP версии 7.0 или выше
Laravel v5.1 или выше
Здесь вы можете увидеть хороший пример:
https://github.com/imanghafoori1/council
Специально этот файл:
https://github.com/imanghafoori1/council/blob/master/app/Providers/AuthServiceProvider.php
Это ответвление от серии руководств laracasts.com, переработанных для использования пакета Heyman.
HTTP-запрос зомби =>
<= Ларавел Хейман
Представьте, что к вам приходит начальник и говорит:
Hey man !!! When you visit the login form, You should be guest, Otherwise you get redirected to '/panel',
Напишите мне код прямо сейчас... Но ПОМНИТЕ, что вам не разрешено трогать текущий код. он очень чувствителен, и мы не хотим, чтобы вы вмешивались в него. Вы можете сломать его.
И вы пишете такой код в методе boot
поставщика услуг, чтобы реализовать то, что хотел ваш начальник.
Вы можете использовать подобные методы в качестве псевдонимов, если вам не нравится слишком подробный синтаксис, предусмотренный по умолчанию.
Псевдонимы ситуаций (например, whenYouMakeView
для view
)
Условия псевдонима (например, youShouldBeGuest
to beGuest
)
Вы должны сделать это в методе загрузки.
1. Таким образом, вы можете полностью decouple
авторизацию и множество защитного кода от остального кода вашего приложения и поместить его в другое место. Таким образом, ваши контроллеры и маршруты станут менее перегруженными, и у вас будет центральное место, где вы сможете ограничить доступ пользователей к вашему приложению или выполнить проверку запроса.
2- Фактически, когда вы пишете свой код таким образом, вы соответствуете знаменитому Tell don't ask principle.
Вы сообщаете системе, что делать в определенных ситуациях, вместо того, чтобы получать информацию и решать, что делать дальше.
Procedural code gets information then makes decisions. Object-oriented code tells objects to do things. — Alec Sharp
3. Этот подход особенно полезен, когда вы, например, пишете пакет, которому нужен ACL, но вы хотите, чтобы пользователи вашего пакета переопределяли и применяли свои собственные правила ACL (или проверки) к маршрутам вашего пакета...
И это становится возможным, когда вы используете laravel-HeyMan для ACL. Пользователи могут легко отменить правила по умолчанию и переписать свои любимые элементы управления доступом или проверки в обычных поставщиках услуг.
Эй, чувак, это потрясающая вещь!
// Это записано в пакете и находится в папке поставщика, поэтому мы не можем его трогать.HeyMan::whenYouHitRouteName('myPackageRoute')->youShouldHaveRole(....;
Чтобы переопределить это, мы используем метод forget
в app/Providers/...
:
публичная функция загрузки() { // Отменяет текущие правила HeyMan::forget()->aboutRoute('myPackageRoute'); // Добавляем новые правила пользователем пакета. HeyMan::whenYouHitRouteName('myPackageRoute')-> ... }
Вам не нужна шпаргалка.
Auto-completion
IDE полностью поддерживается.
Heyman::
?Вы можете поместить их в метод
boot
AuthServiceProvider.php
(или любого другого поставщика услуг).
Вам следует вызвать следующий метод класса HeyMan Facade.
используйте ImanghafooriHeyManFacadesHeyMan;// или используйте HeyMan; // <--- псевдоним
Мы снова рекомендуем посетить этот файл:
Примеры правил работы хеймана
HeyMan:: (ситуация) -> (условие) -> иначе() -> (реакция) ;
HeyMan::whenYouVisitUrl(['/welcome', '/home'])->... // вы можете передать ArrayHeyMan::whenYouVisitUrl('/admin/*')->... // или сопоставить по подстановочный знак
HeyMan::whenYouSendPost('/article/store')-> ... HeyMan::whenYouSendPatch('/article/edit')-> ... HeyMan::whenYouSendPut('/article/edit')-> ... HeyMan::whenYouSendDelete('/article/delete')-> ...
HeyMan::whenYouHitRouteName('welcome.name')->... // Для имен маршрутовHeyMan::whenYouHitRouteName('welcome.*')->... // или сопоставление по подстановочному знаку
HeyMan::whenYouCallAction('HomeController@index')->... HeyMan::whenYouCallAction('HomeController@*')->... // или сопоставление по подстановочному знаку
HeyMan::whenYouMakeView('article.editForm')->... // также принимает массив HeyMan::whenYouMakeView('article.*')->... // Вы можете просмотреть группу представлений
На самом деле это относится к моменту выполнения view('article.editForm')
.
HeyMan::whenEventHappens('myEvent')->...
На самом деле это относится к моменту выполнения event('myEvent')
.
HeyMan::whenYouSave(AppUser::class)->... HeyMan::whenYouFetch(AppUser::class)->... HeyMan::whenYouCreate(AppUser::class)->... HeyMan::whenYouUpdate(AppUser::class)->... HeyMan::whenYouDelete(AppUser::class)->...
На самом деле это относится к моменту, когда eloquent запускает свои внутренние события, такие как: (сохранение, удаление, создание,...)
HeyMan:: (ситуация) -> (условие) -> иначе() -> (реакция) ;
После упоминания ситуации пришло время упомянуть и о состоянии.
// определение GateGate::define('hasRole', function(){...});
Тогда вы можете использовать ворота:
HeyMan::whenYouVisitUrl('/home')->thisGateShouldAllow('hasRole', 'editor')->otherwise()->...;
Передача замыкания как ворот:
$gate = function($user, $role) {///некоторая логика возвращает true; } HeyMan::whenYouVisitUrl('/home')->thisGateShouldAllow($gate, 'editor')->иначе()->...;
HeyMan::whenYouVisitUrl('/home')-> youShouldBeGuest() ->otherwise()->...; HeyMan::whenYouVisitUrl('/home')-> youShouldBeLoggedIn() ->otherwise()->...;
Closure
, Method
или Value
:HeyMan::whenYouVisitUrl('home')->thisMethodShouldAllow('someClass@someMethod', ['param1' => 'value1'])->otherwise()->...; HeyMan::whenYouVisitUrl('home')->thisClosureShouldAllow( function($a) { ... }, ['param1'] ) ->otherwise()->...; HeyMan::whenYouVisitUrl('home')->thisValueShouldAllow( $someValue )->иначе()->...;
HeyMan::whenYouHitRouteName('articles.store')->yourRequestShouldBeValid(['title' => 'required', 'body' => 'required', ]);
Вы также можете изменить данные перед проверкой, вызвав beforeValidationModifyData()
.
$modifier = function ($data) { // удаляет символ «@» из «имени» перед проверкой. $data['name'] = str_replace('@', '', $data['name']); вернуть $данные; } HeyMan::whenYouHitRouteName('welcome.name') ->yourRequestShouldBeValid(['name' => 'required']) ->beforeValidationModifyData($модификатор);
Вы также можете объявить некоторые контрольные точки где-нибудь в коде вашего приложения:
HeyMan::checkPoint('MyLane');
И установите для этого некоторые правила
HeyMan::whenYouReachCheckPoint('MyLane')->youShouldHaveRole('Zombie')-> ...
HeyMan::whenYouVisitUrl('home')->always()-> ... HeyMan::whenYouVisitUrl('home')->sessionShouldHave('key1')->...
Вы также можете использовать методы always
и sessionShouldHave
:
HeyMan::whenYouVisitUrl('home')->always()-> ... HeyMan::whenYouVisitUrl('home')->sessionShouldHave('key1')->...
Вы можете расширить условия и ввести новые методы в API heyman следующим образом:
// Поместите этот код:// в метод `boot` вашего поставщика услугHeyMan::condition('youShouldBeMan', function () { return function () { return auth()->user() && auth()-> user()->пол === 'Мужчина'; }; });// или HeyMan::condition('youShouldBeMan', 'AppSomeWhereSomeClass@someMethod');
Тогда вы можете использовать его следующим образом:
HeyMan::whenYouVisitUrl('home')->youShouldBeMan()-> ...
Приятно, не так ли?!
HeyMan:: (ситуация) -> (условие) -> иначе() -> (реакция) ;
HeyMan::whenSaving(AppUser::class)->thisGateShouldAllow('hasRole', 'editor')->иначе()->weDenyAccess();
При необходимости будет выброшено исключение AuthorizationException
HeyMan::whenYouVisitUrl('/login')-> ... ->иначе()->redirect()->to(...) ->with([...]); HeyMan::whenYouVisitUrl('/login')-> ... ->иначе()->redirect()->route(...) ->withErrors(...); HeyMan::whenYouVisitUrl('/login')-> ... ->иначе()->redirect()->action(...) ->withInput(...); HeyMan::whenYouVisitUrl('/login')-> ... ->иначе()->redirect()->intended(...); HeyMan::whenYouVisitUrl('/login')-> ... ->иначе()->redirect()->guest(...);
На самом деле метод перенаправления здесь очень похож на вспомогательную функцию redirect()
в laravel.
$msg = 'Мое сообщение'; HeyMan::whenYouVisitUrl('/login') ->youShouldBeGuest() ->иначе() ->weThrowNew(AuthorizationException::class, $msg);
HeyMan::whenYouVisitUrl('/login')-> ... ->иначе()->abort(...);
Вызов этих функций генерирует тот же ответ, что и вызов вспомогательной функции response()
: return response()->json(...);
HeyMan::whenYouVisitUrl('/login')-> ... ->иначе()->response()->json(...); HeyMan::whenYouVisitUrl('/login')-> ... ->иначе()->ответ()->view(...); HeyMan::whenYouVisitUrl('/login')-> ... ->иначе()->response()->jsonp(...); HeyMan::whenYouVisitUrl('/login')-> ... ->иначе()->ответ()->make(...); HeyMan::whenYouVisitUrl('/login')-> ... ->иначе()->ответ()->загрузить(...);
HeyMan::whenYouVisitUrl('/login')-> ... ->иначе() ->weRespondFrom('AppHttpResponsesAuthentication@guestsOnly');
пространство имен AppHttpResponses; Аутентификация класса {публичная функция GuestOnly() {if (request()->expectsJson()) {return response()->json(['error' => 'Unauthenticated.'], 401); } return redirect()->guest(route('login')); } }
Эй, чувак, видишь? у нас здесь только Http-ответ. Таким образом, наши диспетчеры могут свободно действовать в нужных ситуациях и не беспокоиться об исключительных ситуациях.
Привет, чувак, возможно, ты захочешь вызвать какой-нибудь метод или запустить событие прямо перед отправкой ответа. Вы можете сделать это с помощью методов afterCalling()
и afterFiringEvent()
.
HeyMan::whenYouVisitUrl('/login')-> ... ->иначе()->afterFiringEvent('explode')->response()->json(...); HeyMan::whenYouVisitUrl('/login')-> ... ->otherwise()->afterCalling('someclass@method1')->response()->json(...);
Вы можете отключить проверки HeyMan следующим образом (полезно при тестировании):
HeyMan::turnOff()->eloquentChecks();.../// Здесь вы можете сохранить несколько красноречивых моделей.../// без ограничений правил HeyMan.... HeyMan::turnOn()->eloquentChecks();
Если вы обнаружили проблему или у вас есть лучший способ сделать что-то, смело открывайте проблему или запрос на включение.
Как всегда, если вы нашли этот пакет полезным и хотите побудить нас поддерживать его и работать над ним. Просто нажмите кнопку со звездочкой, чтобы заявить о своем желании.
Минимальный, но мощный пакет, обеспечивающий лучшую структуру и возможности кэширования для ваших приложений Laravel.
https://github.com/imanghafoori1/laravel-widgetize
Минимальный, но мощный пакет, дающий вам возможность провести рефакторинг ваших контроллеров.
https://github.com/imanghafoori1/laravel-terminator
Это позволяет вам войти в систему с любым паролем только в локальной среде.
https://github.com/imanghafoori1/laravel-anypass
Он автоматически проверяет ваше приложение Laravel ( новое )
https://github.com/imanghafoori1/laravel-microscope
Great spirits have always encountered violent opposition from mediocre minds. "Albert Einstein"