經過充分測試、優化並可投入生產!
我們在幕後解決了許多complexity
,為您提供了許多simplicity
。
與開箱即用的 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
這是 laracasts.com 教學系列的結果的分支,重構為使用 Heyman 套件。
殭屍 Http 請求 =>
<= 拉拉維爾·海曼
想像一下你的老闆來找你並說:
Hey man !!! When you visit the login form, You should be guest, Otherwise you get redirected to '/panel',
現在就為我編寫程式碼...但是請記住,您不允許觸摸當前程式碼。它非常敏感,我們不希望您對其進行篡改。你可能會打破它。
您可以在服務提供者boot
方法中編寫這樣的程式碼來實現老闆想要的東西。
如果您不喜歡預設提供的太多詳細語法,您可以為這樣的方法添加別名。
別名情況(例如, whenYouMakeView
to 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(或驗證)規則應用到您的包路由中時,此方法特別有用...
當您使用 laravel-HeyMan 進行 ACL 時,這一切就成為可能。使用者可以輕鬆取消預設規則並在常規 ServiceProvider 中重寫他們喜歡的 acl 或驗證內容。
嘿夥計,那真是太神奇了!
// 這是寫在 package 中並存在於供應商資料夾中的,所以我們不能碰它。
為了覆蓋它,我們在app/Providers/...
中使用forget
方法:
公共功能啟動(){ //取消目前規則 HeyMan::forget()->aboutRoute('myPackageRoute'); // 依套件使用者新增規則。 HeyMan::whenYouHitRouteName('myPackageRoute')-> ... }
您不需要任何備忘單。
完全支援 IDE
Auto-completion
。
Heyman::
電話放在哪裡?您可以將它們放在
AuthServiceProvider.php
(或任何其他服務提供者)boot
方法中。
您應該呼叫 HeyMan Facade 類別的以下方法。
use ImanghafooriHeyManFacadesHeyMan;// 或use HeyMan; // <--- 別名
我們再次建議存取此文件:
工作 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, '編輯器')->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) { // 在驗證之前從「name」中刪除「@」字元。 $data['name'] = str_replace('@', '', $data['name']); 返回$數據; } 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 ()->性別=== '男人'; }; });// 或 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')-> ... ->否則()->重定向()->預期(...); HeyMan::whenYouVisitUrl('/login')-> ... ->否則()->重定向()->訪客(...);
事實上,這裡的重定向方法非常類似 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')-> ... ->否則()->回應()->下載(...);
HeyMan::whenYouVisitUrl('/login')-> …… ->否則() ->weRespondFrom('AppHttpResponsesAuthentication@guestsOnly');
命名空間 AppHttpResponses;類別 Authentication {公共函數guestOnly() {if (request()->expectsJson()) {return response()->json(['error' => '未經身份驗證。'], 401); }返回重定向()->訪客(路由('登入')); } }
嘿夥計,你看到了嗎?我們這裡只有一個 Http 響應。因此,我們的管制員可以自由地處理正確的情況,而不必擔心特殊情況。
嘿,夥計,您可能想在發迴響應之前呼叫某些方法或觸發事件。您可以透過afterCalling()
和afterFiringEvent()
方法來執行此操作。
HeyMan::whenYouVisitUrl('/login')-> ... ->otherwise()->afterFiringEvent('explode')->response()->json(...); HeyMan::whenYouVisitUrl('/login')-> ... ->otherwise()->afterCalling('someclass@method1')->response()->json(...);
您可以像這樣停用 HeyMan 檢查(在測試時很有用):
HeyMan::turnOff()->eloquentChecks();.../// 您可以在這裡保存一些 eloquent 模型.../// 不受 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"