# Laravel Middleware Priority

Laravel একটি শক্তিশালী ও জনপ্রিয় PHP ফ্রেমওয়ার্ক যা MVC (Model-View-Controller) প্যাটার্ন অনুসরণ করে। Middleware হলো Laravel-এর একটি অত্যন্ত গুরুত্বপূর্ণ ফিচার যা HTTP অনুরোধ আসার আগে ও পরে কিছু নির্দিষ্ট কাজ সম্পাদন করতে সাহায্য করে।

এই ব্লগে আমরা আলোচনা করব **Middleware Priority** নিয়ে – কেন এটা গুরুত্বপূর্ণ, Laravel কিভাবে Middleware গুলোর execution order নির্ধারণ করে, এবং কিভাবে আপনি কাস্টম প্রায়োরিটি সেট করতে পারেন।

---

## 🧩 Middleware কী?

Middleware হলো এমন একটি লেয়ার যেটি আপনার অ্যাপ্লিকেশনের HTTP রিকোয়েস্ট ও রেসপন্সের মাঝখানে কাজ করে। যেমন:

* ইউজার অথেন্টিকেশন চেক
    
* রোল/পারমিশন যাচাই
    
* XSS বা CSRF প্রোটেকশন
    
* API রেট লিমিট
    

আপনি middleware ব্যবহার করে রিকোয়েস্ট ফিল্টার করতে পারেন এবং কিছু নির্দিষ্ট রুল প্রয়োগ করতে পারেন।

---

## 📜 Middleware Execution Order

Laravel-এ অনেক middleware থাকে – কিছু গ্লোবালি (global middleware) থাকে, কিছু রাউট-ভিত্তিক (route middleware) হিসেবে ব্যবহৃত হয়। কিন্তু প্রশ্ন হলো, যদি একাধিক middleware থাকে, তাহলে Laravel কোনটা আগে execute করবে?

Laravel এই ক্ষেত্রে **priority** অনুসরণ করে।

---

## 🔃 Middleware Priority কেন গুরুত্বপূর্ণ?

ধরুন, আপনার দুটি middleware আছে:

1. `EncryptCookies` – এটি রিকোয়েস্ট/রেসপন্সে কুকি এনক্রিপ্ট করে
    
2. `StartSession` – এটি session চালু করে
    

এখানে প্রথমে `EncryptCookies` চালু না হলে `StartSession` সঠিকভাবে কাজ করবে না। তাই Laravel একটি **middleware priority list** মেইনটেইন করে।

---

## 🏗️ Laravel Middleware Priority কোথায় সেট করা হয়?

Middleware priority list ডিফাইন করা হয় `app/Http/Kernel.php` ফাইলে। নিচে একটি উদাহরণ দেওয়া হলো:

```plaintext
protected $middlewarePriority = [
    \Illuminate\Session\Middleware\StartSession::class,
    \Illuminate\View\Middleware\ShareErrorsFromSession::class,
    \App\Http\Middleware\Authenticate::class,
    \Illuminate\Routing\Middleware\ThrottleRequests::class,
    \Illuminate\Session\Middleware\AuthenticateSession::class,
    \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
    \Illuminate\Cookie\Middleware\EncryptCookies::class,
];
```

এই লিস্টটি Laravel কে বলে দেয় কোন middleware আগে চলবে এবং কোনটা পরে।

---

## 🛠️ কাস্টম Middleware এর Priority কিভাবে নির্ধারণ করবেন?

ধরুন, আপনি একটি কাস্টম middleware তৈরি করেছেন `CheckUserActive` নামে:

```plaintext
php artisan make:middleware CheckUserActive
```

এখন আপনি চান এটি `Authenticate` middleware এর আগে চলে। এজন্য `Kernel.php` ফাইলে `$middlewarePriority` এর মধ্যে আপনার middleware যুক্ত করুন:

```plaintext
protected $middlewarePriority = [
    \App\Http\Middleware\CheckUserActive::class,
    \App\Http\Middleware\Authenticate::class,
    ...
];
```

> **Note:** `$middlewarePriority` শুধুমাত্র **route middleware** এর ক্ষেত্রে কার্যকর।

---

## 🧠 কিছু বাস্তব উদাহরণ

### ✅ সঠিক অর্ডার:

```plaintext
[
    EncryptCookies::class,
    AddQueuedCookiesToResponse::class,
    StartSession::class,
    AuthenticateSession::class,
]
```

### ❌ ভুল অর্ডার:

```plaintext
[
    StartSession::class,
    EncryptCookies::class,
]
```

উপরে ভুল অর্ডারে `StartSession` কুকি রিড করার আগেই session শুরু করার চেষ্টা করবে, ফলে সমস্যা হতে পারে।

---

## 🔐 Global vs Route Middleware

* **Global Middleware:** সব রিকোয়েস্টের জন্য কার্যকর।
    
* **Route Middleware:** নির্দিষ্ট রাউট বা গ্রুপে প্রয়োগ হয়।
    

Priority শুধুমাত্র **route middleware** এর জন্য প্রযোজ্য।

---

Middleware priority Laravel অ্যাপ্লিকেশনের জন্য অত্যন্ত গুরুত্বপূর্ণ একটি বিষয়। সঠিক execution order নিশ্চিত না হলে আপনার authentication, session, কিংবা cookie system ঠিকমতো কাজ নাও করতে পারে।

আপনি যদি কাস্টম middleware তৈরি করেন, তাহলে অবশ্যই তার priority সঠিকভাবে সেট করুন `Kernel.php` ফাইলে।
