تم اختباره جيدًا، وتحسينه، وجاهز للإنتاج!
لقد عالجنا الكثير من complexity
خلف الكواليس، لنوفر لك الكثير من simplicity
.
متكامل مع حزمة laravel-debugbar الجاهزة: laravel debugbar
composer require imanghafoori/laravel-heyman
PHP v7.0 أو أعلى
لارافيل v5.1 أو أعلى
هنا يمكنك رؤية مثال جيد على:
https://github.com/imanghafoori1/council
خصيصا هذا الملف:
https://github.com/imanghafoori1/council/blob/master/app/Providers/AuthServiceProvider.php
هذه شوكة من نتيجة سلسلة دروس laracasts.com المعاد تصميمها لاستخدام حزمة Heyman.
طلب زومبي المتشعب =>
<= لارافيل هيمان
تخيل أن رئيسك يأتي إليك ويقول:
Hey man !!! When you visit the login form, You should be guest, Otherwise you get redirected to '/panel',
اكتب لي الرمز الآن... لكن ضع في اعتبارك أنه لا يُسمح لك بلمس الرمز الحالي. فهو حساس للغاية ولا نريد أن تعبث به. قد تكسرها.
وتكتب رمزًا مثل هذا في طريقة boot
موفر الخدمة لتنفيذ ما يريده رئيسك في العمل.
يمكنك استخدام أسماء مستعارة لطرق مثل هذه إذا كنت لا تحب الكثير من البنية المطولة المتوفرة افتراضيًا.
حالات الاسم المستعار (على سبيل المثال، whenYouMakeView
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 العاديين.
يا رجل، هذا شيء مذهل!
// هذا مكتوب في الحزمة وموجود في مجلد البائع، لذلك لا يمكننا لمسه.HeyMan::whenYouHitRouteName('myPackageRoute')->youShouldHaveRole(....;
لتجاوز ذلك نستخدم طريقة forget
، داخل app/Providers/...
:
التمهيد الوظيفة العامة () { // يلغي القواعد الحالية HeyMan::forget()->aboutRoute('myPackageRoute'); // أضف قواعد جديدة حسب مستخدم الحزمة. HeyMan::whenYouHitRouteName('myPackageRoute')-> ... }
لا تحتاج إلى أي ورقة الغش.
يتم دعم
Auto-completion
لـ IDE بشكل كامل.
Heyman::
؟يمكنك وضعها في طريقة
boot
AuthServiceProvider.php
(أو أي مزود خدمة آخر).
يجب عليك استدعاء الطريقة التالية لفئة 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) {// بعض المنطق يعود صحيحًا؛ } 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']); إرجاع بيانات $؛ } 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 مثل هذا:
// ضع هذا الكود:// في طريقة "التمهيد" لمقدمي الخدمة لديكHeyMan::condition('youShouldBeMan', function () { return function () { return auth()->user() && auth()-> user()->gender === 'Man'; }; });// أو HeyMan::condition('youShouldBeMan', 'AppSomeWhereSomeClass@someMethod');
ثم يمكنك استخدامه مثل هذا:
HeyMan::whenYouVisitUrl('home')->youShouldBeMan()-> ...
جميل أليس كذلك؟!
HeyMan:: (الحالة) -> (الحالة) -> وإلا() -> (رد الفعل) ؛
HeyMan::whenSaving(AppUser::class)->thisGateShouldAllow('hasRole', 'editor')->otherwise()->weDenyAccess();
سيتم طرح AuthorizationException
إذا لزم الأمر
HeyMan::whenYouVisitUrl('/login')-> ... ->خلاف ذلك()->redirect()->to(...) ->with([...]); HeyMan::whenYouVisitUrl('/login')-> ... ->خلاف ذلك()->redirect()->route(...) ->withErrors(...); HeyMan::whenYouVisitUrl('/login')-> ... ->خلاف ذلك()->redirect()->action(...) ->withInput(...); HeyMan::whenYouVisitUrl('/login')-> ... ->خلاف ذلك()->redirect()->intened(...); HeyMan::whenYouVisitUrl('/login')-> ... ->خلاف ذلك()->redirect()->guest(...);
في الواقع، طريقة إعادة التوجيه هنا تشبه إلى حد كبير وظيفة المساعدة redirect()
في Laravel.
$msg = 'رسالتي'; HeyMan::whenYouVisitUrl('/تسجيل الدخول') ->youShouldBeGuest() ->وإلا() ->weThrowNew(AuthorizationException::class, $msg);
HeyMan::whenYouVisitUrl('/login')-> ... ->خلاف ذلك()->abort(...);
يؤدي استدعاء هذه الوظائف إلى توليد نفس الاستجابة تمامًا مثل استدعائها على الوظيفة المساعدة 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()->download(...);
HeyMan::whenYouVisitUrl('/login')-> ... ->وإلا() ->weRespondFrom('AppHttpResponsesAuthentication@guestsOnly');
مساحة الاسم AppHttpResponses؛ مصادقة الفئة {ضيوف الوظيفة العامة فقط () {if (request()->expectsJson()) {return Response()->json(['error' => 'Uauthenticated.'], 401); }return redirect()->guest(route('login')); } }
يا رجل، هل ترى؟ لدينا فقط استجابة 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-micrscope
Great spirits have always encountered violent opposition from mediocre minds. "Albert Einstein"