ได้รับการทดสอบ เพิ่มประสิทธิภาพ และพร้อมสำหรับการผลิตเป็นอย่างดี!
เราได้จัดการกับ complexity
เบื้องหลังมากมาย เพื่อให้คุณมี simplicity
ได้มาก
ผสานรวมกับแพ็คเกจ laravel-debugbar ทันที: laravel debugbar
composer require imanghafoori/laravel-heyman
PHP v7.0 หรือสูงกว่า
Laravel เวอร์ชัน 5.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
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 ผู้ใช้สามารถยกเลิกกฎเริ่มต้นได้อย่างง่ายดาย และเขียน acl หรือการตรวจสอบความถูกต้องที่ชื่นชอบใน ServiceProviders ปกติอีกครั้ง
เฮ้เพื่อน นั่นเป็นสิ่งที่มหัศจรรย์มาก!
// สิ่งนี้เขียนในแพ็คเกจและอยู่ในโฟลเดอร์ vendor ดังนั้นเราจึงไม่สามารถแตะมันได้HeyMan::whenYouHitRouteName('myPackageRoute')->youShouldHaveRole(....;
หากต้องการแทนที่ว่าเราใช้วิธี forget
ภายใน app/Providers/...
:
บูตฟังก์ชั่นสาธารณะ () { // ยกเลิกกฎปัจจุบัน HeyMan::forget()->aboutRoute('myPackageRoute'); // เพิ่มกฎใหม่โดยผู้ใช้แพ็คเกจ HeyMan::whenYouHitRouteName('myPackageRoute')-> ... -
คุณไม่จำเป็นต้องมีแผ่นโกงใด ๆ
รองรับ
Auto-completion
ของ IDE อย่างสมบูรณ์
Heyman::
เหล่านี้ไว้ที่ไหน?คุณสามารถใส่ไว้ในวิธี
boot
AuthServiceProvider.php
(หรือผู้ให้บริการรายอื่น)
คุณควรเรียกเมธอดต่อไปนี้ของคลาส HeyMan Facade
ใช้ ImanhafooriHeyManFacadesHeyMan;// หรือใช้ 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')->มิฉะนั้น()->...;
ผ่านการปิดเหมือนประตู:
$gate = function($user, $role) {/// ตรรกะบางอย่างคืนค่าเป็นจริง; - HeyMan::whenYouVisitUrl('/home')->thisGateShouldAllow($gate, 'editor')->มิฉะนั้น()->...;
HeyMan::whenYouVisitUrl('/home')-> youShouldBeGuest() ->มิฉะนั้น()->...; HeyMan::whenYouVisitUrl('/home')-> youShouldBeLoggedIn() ->มิฉะนั้น()->...;
Closure
หรือ Method
หรือ Value
:HeyMan::whenYouVisitUrl('home')->thisMethodShouldAllow('someClass@someMethod', ['param1' => 'value1'])->มิฉะนั้น()->...; HeyMan::whenYouVisitUrl('home')->thisClosureShouldAllow( function($a) { ... }, ['param1'] ) ->มิฉะนั้น()->...; 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')->...
คุณสามารถขยายเงื่อนไขและแนะนำวิธีการใหม่ให้กับ heyman API ได้ดังนี้:
// วางโค้ดนี้:// ในเมธอด `boot` ของผู้ให้บริการของคุณHeyMan::condition('youShouldBeMan', function () { return function () { return auth()->user() && auth()-> ผู้ใช้()->เพศ === 'ผู้ชาย'; - });// หรือ 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')-> ... ->มิฉะนั้น()->เปลี่ยนเส้นทาง()->ตั้งใจ(...); HeyMan::whenYouVisitUrl('/login')-> ... ->มิฉะนั้น()->redirect()->guest(...);
อันที่จริงวิธีการเปลี่ยนเส้นทางที่นี่เหมือนกับฟังก์ชันตัวช่วย redirect()
ของ laravel มาก
$msg = 'ข้อความของฉัน'; HeyMan::whenYouVisitUrl('/login') ->คุณควรเป็นแขก() -> มิฉะนั้น() ->weThrowNew(AuthorizationException::class, $msg);
HeyMan::whenYouVisitUrl('/login')-> ... ->มิฉะนั้น()->ยกเลิก(...);
การเรียกใช้ฟังก์ชันเหล่านี้จะสร้างการตอบสนองเหมือนกับการเรียกใช้ฟังก์ชันตัวช่วย response()
: return response()->json(...);
HeyMan::whenYouVisitUrl('/login')-> ... ->มิฉะนั้น()->response()->json(...); HeyMan::whenYouVisitUrl('/login')-> ... ->มิฉะนั้น()->response()->view(...); HeyMan::whenYouVisitUrl('/login')-> ... ->มิฉะนั้น()->response()->jsonp(...); HeyMan::whenYouVisitUrl('/login')-> ... ->มิฉะนั้น()->response()->make(...); HeyMan::whenYouVisitUrl('/login')-> ... ->มิฉะนั้น()->response()->ดาวน์โหลด(...);
HeyMan::whenYouVisitUrl('/login')-> - -> มิฉะนั้น() ->เราตอบกลับจาก('AppHttpResponsesAuthentication@guestsOnly');
AppHttpResponses เนมสเปซ; การรับรองความถูกต้องของคลาส {แขกในงานสาธารณะเท่านั้น() {if (request()->expectsJson()) {return response()->json(['error' => 'Unauthenticated.'], 401); } } เปลี่ยนเส้นทางกลับ () -> แขก (เส้นทาง ('เข้าสู่ระบบ')); - -
เฮ้เพื่อน คุณเห็นไหม? เรามีเพียงการตอบกลับ Http ที่นี่ ดังนั้นผู้ควบคุมของเราจึงมีอิสระที่จะจัดการกับสถานการณ์ที่เหมาะสมและไม่ต้องกังวลกับสถานการณ์พิเศษ
เฮ้เพื่อน คุณอาจต้องการโทรหาวิธีการบางอย่างหรือเริ่มกิจกรรมก่อนที่คุณจะตอบกลับ คุณสามารถทำได้โดยใช้เมธอด afterCalling()
และ afterFiringEvent()
HeyMan::whenYouVisitUrl('/login')-> ... ->มิฉะนั้น()->afterFiringEvent('explode')->response()->json(...); HeyMan::whenYouVisitUrl('/login')-> ... ->มิฉะนั้น()->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"