


Очень хорошо протестировано, оптимизировано и готово к производству!
Мы устранили множество 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-completionIDE полностью поддерживается.

Heyman:: ?Вы можете поместить их в метод
bootAuthServiceProvider.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"