非常によくテストされ、最適化されており、本番環境にすぐに使用できます。
私たちは、多くの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
)
これはブートメソッドで行う必要があります。
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を使用するとそれが可能になります。ユーザーは、デフォルトのルールを簡単にキャンセルして、お気に入りの ACL や検証内容を通常の ServiceProvider に書き直すことができます。
やあ、それはすごいことだよ!
// これはパッケージに書かれており、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 クラスの次のメソッドを呼び出す必要があります。
use ImaghafooriHeyManFacadesHeyMan;// または use 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) {/// いくつかのロジックreturn 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' => 'required', 'body' => 'required', ]);
beforeValidationModifyData()
を呼び出して、検証前にデータを変更することもできます。
$modifier = function ($data) { // 検証前に「名前」から「@」文字を削除します。 $data['name'] = str_replace('@', '', $data['name']); $data を返します。 } HeyMan::whenYouHitRouteName('welcome.name') ->yourRequestShouldBeValid(['名前' => '必須']) ->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()->gender === '男'; }; });// または 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') ->youShouldBeGuest() ->そうでない場合() ->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' => 'Unauthenticated.'], 401); }return redirect()->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アプリケーションを自動的にチェックします( new )
https://github.com/imanghafoori1/laravel-microscope
Great spirits have always encountered violent opposition from mediocre minds. "Albert Einstein"