الكورس

Advertisements

Laravel Middleware


Middleware هو مكون أساسي في Laravel ويوفر طريقة لتصفية طلبات HTTP التي يتم إدخالها في مشروعك.

يحتوي Laravel على برنامج Middleware(وسيط) يتحقق مما إذا كان مستخدم التطبيق موثوق به أم لا، إذا تم التأكد من مصداقية المستخدم ، فإنه يعيد التوجيه إلى الصفحة الرئيسية، إذا وجد شىء أخر، فإنه يعيد توجيه إلى صفحة تسجيل الدخول.

💡 جميع برامج الـ Middleware موجودة في مجلد: app/Http/Middleware.

 


 

Define Middleware

 

يمكن تعريف Middleware على أنها وسيطة أو واجهة تعمل بالتنسيق بين الطلب والاستجابة.

💡 لإنشاء برنامج Middleware ‘وسيط’ جديد ، يجب أن يكون الـ syntax الأمر كالتالى:

php artisan make:middleware<middleware_name>

💡 الأن سنُبدل <middleware_name> بإسم الـ middleware الذى نريده، وليكن “CheckAge”:

php artisan make:middleware CheckAge

💡 الأمر السابق سيضع Class الـ CheckAge الجديد فى مجلد app/Http/Middleware، في هذه Middleware، لن نسمح بالوصول إلى المسار إلا إذا كان العمر المقدم (عمر المستخدم) أكبر من 40، وإلا سوف نعيد المستخدم إلى عنوان URI الرئيسي:

<?php

namespace App\Http\Middleware;

use Closure;

class CheckAge {

    public function handle($request, Closure $next){
        if ($request->age < 40) {
            return redirect('home');
        }

        return $next($request);
    }
}

💡 فى المثال السابق: إذا كان العمر المحدد أقل من 40، فإن Middleware ستعيد إعادة توجيه HTTP إلى العميل (المُستخدم)؛ خلاف ذلك سيتم تمرير الطلب إلى التطبيق.

 


 

Registering Middleware

 

نحتاج إلى تسجيل كل وسيطة(middlleware) قبل استخدامها.

هناك نوعان من الـmiddlleware في Laravel:

  1. Global Middleware
  2. Route Middleware

 

Global middlewares هي تلك الـmiddlewares التي سيتم تشغيلها أثناء كل طلب HTTP لتطبيقك، يمكن تسجيل الـ middlewares في app / Http / Kernel.php: يحتوي هذا الملف على خاصيتين:

  1. middleware$: يتم استخدام هذه الخاصية للتسجيل في Global Middleware.
  2. routeMiddleware$: يتم استخدام هذه الخاصية للتسجيل فى Route Middleware.

 

💡 لتسجيل البرامج Global middlewares، قم بإضافة الـ class في نهاية خاصية middleware$:

protected $middleware = [
   \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
   \App\Http\Middleware\EncryptCookies::class,
   \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
   \Illuminate\Session\Middleware\StartSession::class,
   \Illuminate\View\Middleware\ShareErrorsFromSession::class,
];

💡 لإضافة برامج الـ Route middleware المخصصة، تحتاج إلى إلحاقها بالقائمة وإضافة Key ‘مفتاح’ من اختيارك، كالتالى:

protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
    'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];

Middleware Parameters

 

يمكن أيضًا تمرير parameters إلى الـ middlewares، على سبيل المثال عندما يكون لمشروعك attributes مثل العميل أو الموظف أو المشرف أو المالك ، وما إلى ذلك ، وترغب في تنفيذ وحدات مختلفة بناءً على أدوار المستخدم ، في هذه المواقف ، تصبح parameters الـ middlewares مفيدة.

 

مثال للتوضيح:

public function handle($request, Closure $next, $profile)
   {
       if (! $request->user()->hasProfile($profile)) {
           // Next page
       }
       return $next($request);
   }
}

💡 تحتاج إلى إنشاء middleware للـ profile عن طريق تشغيل الأمر التالى:

php artisan make:middleware ProfileMiddleware

💡 يمكن التعامل مع برامج الـ Middleware التي تم إنشاؤها حديثًا باستخدام: app/Http/Middleware/ProfileMiddleware.php

<?php

namespace App\Http\Middleware;
use Closure;

class ProfileMiddleware {
   public function handle($request, Closure $next, $Profile) {
      echo "Role: ".$Profile;
      return $next($request);
   }
}

Terminable Middleware

 

في بعض الأحيان ، قد تحتاج برامج الـ middleware إلى القيام ببعض الأعمال بعد إرسال استجابة HTTP إلى المتصفح، يتم استخدام method الـ terminate للقيام ذلك.

عند استخدام method الـ terminate في وسيطة لمشروعك ، يتم استدعاؤها تلقائيًا بعد إرسال استجابة المتصفح.

 

مثال للتوضيح:

<?php

namespace Illuminate\Session\Middleware;
use Closure;

class SessionBegin {
    
    public function handle($request, Closure $next) {
        return $next($request);
    }
    
    public function terminate($request, $response){
        // tasks assigned within terminate method
    }
}

💡 يجب أن يتلقى method الـ terminate كل من الطلب والاستجابة.


 

💡 Done: تم الإنتهاء من Middlewares، حاول تراجع الفصل أكثر من مره لزيادة الفهم، فى الفصل القادم بإذن الله، سنتعرف على الـ Controllers.

 



الإبلاغ عن خطأ

×

إذا وجد خطأ وتريد الإبلاغ عن هذا الخطأ، أو إذا كنت تريد تقديم اقتراح على شىء معين، فلا تتردد في إرسال بريد إلكتروني إلينا:

[email protected]

شكرًا لك على مساعدتك لنا!

Advertisements