매우 잘 테스트되고 최적화되었으며 생산 준비가 완료되었습니다!
우리는 많은 simplicity
제공하기 위해 뒤에서 많은 complexity
다루었습니다.
즉시 사용 가능한 laravel-debugbar 패키지와 통합: laravel debugbar
composer require imanghafoori/laravel-heyman
PHP v7.0 이상
Laravel v5.1 이상
여기에서 좋은 예를 볼 수 있습니다.
https://github.com/imanghafoori1/council
특히 이 파일은 다음과 같습니다.
https://github.com/imanghafoori1/council/blob/master/app/Providers/AuthServiceProvider.php
이것은 Heyman 패키지를 사용하도록 리팩토링된 laracasts.com 튜토리얼 시리즈의 결과입니다.
좀비 HTTP 요청 =>
<= 라라벨 헤이먼
당신의 상사가 당신에게 와서 이렇게 말한다고 상상해 보십시오:
Hey man !!! When you visit the login form, You should be guest, Otherwise you get redirected to '/panel',
지금 바로 코드를 작성해 주세요. 하지만 현재 코드를 건드릴 수 없다는 점을 명심하세요. 이는 매우 민감하므로 귀하가 이를 조작하는 것을 원하지 않습니다. 깨질 수도 있습니다.
그리고 상사가 원하는 것을 구현하기 위해 서비스 공급자 boot
방법에 이와 같은 코드를 작성합니다.
기본적으로 제공되는 너무 자세한 구문이 마음에 들지 않으면 이와 같은 메서드에 별칭을 지정할 수 있습니다.
별칭 상황(예: whenYouMakeView
view
때)
별칭 조건(예: youShouldBeGuest
에서 beGuest
로)
boot 메소드에서 하셔야 합니다.
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(또는 유효성 검사) 규칙을 재정의하고 패키지 경로에 적용하도록 허용하려는 경우에 특히 유용합니다.
그리고 이는 ACL에 laravel-HeyMan을 사용하면 가능해집니다. 사용자는 기본 규칙을 쉽게 취소하고 일반 ServiceProvider에서 선호하는 ACL 또는 유효성 검사 항목을 다시 작성할 수 있습니다.
안녕하세요, 정말 놀라운 일이네요!
// 패키지에 작성되어 Vendor 폴더에 있으므로 건드릴 수 없습니다.HeyMan::whenYouHitRouteName('myPackageRoute')->youShouldHaveRole(....;
이를 재정의하려면 app/Providers/...
내에서 forget
메서드를 사용합니다.
공개 함수 boot() { // 현재 규칙을 취소합니다. HeyMan::forget()->aboutRoute('myPackageRoute'); // 패키지 사용자별로 새로운 규칙을 추가합니다. HeyMan::whenYouHitRouteName('myPackageRoute')-> ... }
치트 시트가 필요하지 않습니다.
IDE
Auto-completion
완벽하게 지원됩니다.
Heyman::
호출을 어디에 넣어야 하나요?
AuthServiceProvider.php
(또는 다른 서비스 제공자)boot
방법에 넣을 수 있습니다.
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)->...
실제로 이는 다음과 같은 내부 이벤트(저장, 삭제, 생성 등)가 실행되는 순간을 나타냅니다.
HeyMan:: (상황) -> (조건) -> 그렇지 않으면() -> (반응) ;
상황을 언급한 후에는 조건을 언급할 차례입니다.
// GateGate::define('hasRole', function(){...}) 정의;
그런 다음 게이트를 사용할 수 있습니다.
HeyMan::whenYouVisitUrl('/home')->thisGateShouldAllow('hasRole', 'editor')->otherwise()->...;
클로저를 게이트로 전달하기:
$gate = function($user, $role) {/// 일부 로직은 true를 반환합니다. } HeyMan::whenYouVisitUrl('/home')->thisGateShouldAllow($gate, 'editor')->otherwise()->...;
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 )->otherwise()->...;
HeyMan::whenYouHitRouteName('articles.store')->yourRequestShouldBeValid(['title' => '필수', 'body' => '필수', ]);
beforeValidationModifyData()
호출하여 유효성 검사 전에 데이터를 수정할 수도 있습니다.
$modifier = function ($data) { // 유효성 검사 전에 "이름"에서 "@" 문자를 제거합니다. $data['name'] = str_replace('@', '', $data['name']); $data를 반환합니다. } HeyMan::whenYouHitRouteName('welcome.name') ->yourRequestShouldBeValid(['name' => 'required']) ->beforeValidationModifyData($modifier);
애플리케이션 코드 내 어딘가에 몇 가지 체크포인트를 선언할 수도 있습니다.
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')->...
다음과 같이 조건을 확장하고 heyman API에 새로운 메소드를 도입할 수 있습니다.
// 이 코드를 넣으세요:// 서비스 공급자의 `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')->otherwise()->weDenyAccess();
필요한 경우 AuthorizationException
이 발생합니다.
HeyMan::whenYouVisitUrl('/login')-> ... ->otherwise()->redirect()->to(...) ->with([...]); HeyMan::whenYouVisitUrl('/login')-> ... ->otherwise()->redirect()->route(...) ->withErrors(...); HeyMan::whenYouVisitUrl('/login')-> ... ->otherwise()->redirect()->action(...) ->withInput(...); HeyMan::whenYouVisitUrl('/login')-> ... ->otherwise()->redirect()->intended(...); HeyMan::whenYouVisitUrl('/login')-> ... ->otherwise()->redirect()->guest(...);
실제로 여기서 리디렉션 방법은 laravel의 redirect()
도우미 함수와 매우 유사합니다.
$msg = '내 메시지'; HeyMan::whenYouVisitUrl('/login') ->당신은Guest가 되어야 합니다() ->그렇지 않으면() ->weThrowNew(AuthorizationException::class, $msg);
HeyMan::whenYouVisitUrl('/login')-> ... ->otherwise()->abort(...);
이러한 함수를 호출하면 response()
도우미 함수에서 호출하는 것과 똑같은 응답이 생성됩니다. return response()->json(...);
HeyMan::whenYouVisitUrl('/login')-> ... ->otherwise()->response()->json(...); HeyMan::whenYouVisitUrl('/login')-> ... ->otherwise()->response()->view(...); HeyMan::whenYouVisitUrl('/login')-> ... ->otherwise()->response()->jsonp(...); HeyMan::whenYouVisitUrl('/login')-> ... ->otherwise()->response()->make(...); HeyMan::whenYouVisitUrl('/login')-> ... ->otherwise()->response()->download(...);
HeyMan::whenYouVisitUrl('/login')-> ... ->그렇지 않으면() ->weRespondFrom('AppHttpResponsesAuthentication@guestsOnly');
네임스페이스 AppHttpResponses;클래스 인증 {공개 함수 guestOnly() {if (request()->expectsJson()) {return response()->json(['error' => '인증되지 않음.'], 401); }return 리디렉션()->guest(route('login')); } }
안녕 친구, 알겠어? 여기에는 Http 응답만 있습니다. 따라서 우리 컨트롤러는 올바른 상황을 자유롭게 처리하고 예외적인 상황에 대해 걱정하지 않습니다.
안녕하세요, 응답을 다시 보내기 직전에 메소드를 호출하거나 이벤트를 발생시키고 싶을 수도 있습니다. afterCalling()
및 afterFiringEvent()
메서드를 사용하면 됩니다.
HeyMan::whenYouVisitUrl('/login')-> ... ->otherwise()->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"