


經過充分測試、優化並可投入生產!
我們在幕後解決了許多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"