# মিডলওয়্যার

মিডলওয়্যার লারাভেলের খুবই গুরুত্বপূর্ণ ও মজার একটি ফিচার । সহজ কথায় বলতে গেলে এটি একটি ফিল্টার মেকানিজম । যেমনঃ লারাভেলের (ইউজার অথেনটিকেশন )।

## মিডলওয়্যার আসলে কি ?

মিডলওয়্যার কি তা তার নামের মধ্যেই আছে । মিডলওয়্যার রিকুয়েস্ট ও রেস্পন্সের মধ্যে সম্পর্ক স্থাপনকারী । ইউজার এর HTTP রিকুয়েস্ট ফিল্টার করে রিকুয়েস্টের পরে রেস্পন্স কি হবে তা মিডলওয়্যারে লেখা থাকে।

## কখন মিডলওয়্যার ব্যবহার করব ?

১. যেকোনো রকমের ইউজার অথেনটিকেশন ।

২. রাউটের মাধ্যমে আসা কোন API KEY হ্যান্ডেল করতে ।

৩. আপনার অ্যাপের জন্য এক্সেস মডিফায়ার তৈরি করতে (যেমনঃ ইউজার গেস্ট হলে কি দেখবে অথবা ইউজার অ্যাডমিন হলে কোন পেজ দেখাবে) ।

এতক্ষণে আশা করছি বুঝেই গেছেন মিডলওয়্যার এর গুরুত্ব । আসুন এবার মিডলওয়্যার বানিয়েই ফেলি।

### ১. মিডলওয়্যার তৈরিঃ

Artisan এর মাধ্যমে লারাভেলে মিডলওয়্যার তৈরি করা সত্যিই পান্তাভাত (ইলিশ মাছ ছাড়া :p) Terminal ওপেন করুন এবং লিখুনঃ

```
php artisan make:middleware <middleware Name>
```

### ২. মিডলওয়্যার রেজিস্টার করাঃ

আমরা একটা মিডলওয়্যার নাহয় বানিয়েই ফেললাম। কিন্তু দেখেন এখন যে যুগ আসছে সবাইকেই ভেরিফাই করা লাগে !! তাহলে মিডলওয়্যারকে কেন নয় ??

চলুন দেখে নেই কিভাবে মিডলওয়্যার ভেরিফাই করা যায় ।

আপনি যদি আপনার মিডলওয়্যারটিকে সব রিকুয়েস্টের ক্ষেত্রেই একটিভ দেখতে চান তাহলেঃ

`app/Http/kernel.php` এই ফাইলটি ওপেন করুন। এবং $middleware অ্যারেতে এভাবে অ্যাড করুনঃ

```php
protected $middleware = [
...
\App\Http\Middleware\<middleware Name>:: class
]
```

### ৩. রাউটারে মিডলওয়্যার রেজিস্টারঃ

এখন আপনি যদি মিডলওয়্যার ইউজারকে আপনার অ্যাপের নির্দিষ্ট কোন লিঙ্কে যাওয়ার সময় চেক করতে চান তাহলে মিডলওয়্যারটিকে রাউটের সাথে বেধে দিতে পারেন। যেমনঃ

```php
Route::get (‘welcome’, ‘WelcomeController@profile_info’);
```

এখানে লক্ষ করুন ইউজার `<appURL>/welcome` লিখলে রাউট তাকে `WelcomeController` এর `profile_info` function এ নিয়ে যাবে।

এখন আপনার ভাবনায় আসলো যে ...না এভাবে কোন ইউজার এসে প্রফাইল ইনফো নিয়ে জেতে পারবেন না। তাকে আগে দেখাতে হবে যে সে আসলেই আমার ইউজার । আপনার এই সমস্যার সমাধান নিয়েই হাজির মিডলওয়্যার!!

আপনি ইচ্ছা করলেই রাউটএর সাথে বেধে দিতে পারেন আপনার মিডলওয়্যারকে ঠিক আমি জেভাবে লিখলাম সেভাবে। ধরে নেই আপনার একটি auth মিডলওয়্যার আসে যেটা আপনার অ্যাপ ইউজার কিনা চেক করে। তাহলে লিখে ফেলুন এভাবেঃ

```php
Route::get('welcome', 'WelcomeController@profile_info')->middleware('Auth');
```

আবার ইচ্ছা করলে একাধিক মিডলওয়্যার ও ব্যবহার করতে পারেন এভাবেঃ

```php
Route::get('welcome', 'WelcomeController@profile_info')->middleware('Auth', 'admin');
```

### ৪. মিডলওয়্যার গ্রুপঃ

লারাভেল আপনার কাজকে সহজ করার জন্য অতিমানবীয় আইডিয়া এনেছে এখানে। আপনি ভাবছেন আপনার অ্যাপে ওয়েব ও এপিআই রাউট দুইভাবে ইউজারকে ডাটা দিবেন। কিন্তু এত নিখুত ভাবে কত মিডলওয়্যার লিখা যায় ?? এই সমস্যা সমাধান এর জন্য লারাভেল এনেছে গ্রুপ মিডলওয়্যার । `app/Http/kernel.php` এই ফাইলে দেখবেন এভাবে লেখা আছে ।

```php
protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
    'api' => [
        'throttle:60,1',
        'auth:api',
    ],
];
```

এই দুই অ্যারেতে আপনার ইচ্ছানুযায়ী মিডলওয়্যার অ্যাড করে দিতে পারেন ।

### 5. মিডলওয়্যার প্যারামিটারঃ

আমরা ইচ্ছা করলে মিডলওয়্যারে প্যারামিটার পাস করতে পারি। ধরি আমাদের মিডলওয়্যারটি ইউজারএর রোল চেক করবে। তো মিডলওয়্যার ফাঙ্কশনে আমরা Closure প্যারামিটার এর মধ্যে দিয়ে $request পাস করতে পারি। যেমনঃ

```php
public function handle($request, Closure $next, $role)
{
    if (! $request->user()->hasRole($role)) {
        // Redirect...
    }
    return $next($request);
}
```

এখন আমরা রাউটে মিডলওয়্যার অ্যাড করে দিব ।

```php
Route::post('post/{id}', ['middleware' => 'role:editor', function ($id) {
    //
}]);
```

এখন আপনি যদি চান মিডলওয়্যার আগে রান করবে এবং তারপর ইউজারকে রেসপন্স পাঠাবে । তাহলে আমরা এভাবে লিখতে পারিঃ

```php
public function handle($request, Closure $next)
{
    $response = $next($request);

    /**
    * Perform actions here
    */

    return $response;
}
```

## উপসংহারঃ

এখানে মোটামোটি মিডলওয়্যার নিয়ে ডিটেইলস আলোচনা করা হয়েছে । আপনি আরও জানতে চাইলে ভিজিট করুন লারাভেলের অফিসিয়াল পেইজে ।


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://laravel.howtocode.dev/middleware.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
