# Laravel Route Model Binding

## 🔍 Route Model Binding কী?

Route Model Binding হলো Laravel-এর একটি ফিচার, যার মাধ্যমে আপনি রাউটে থাকা প্যারামিটারকে স্বয়ংক্রিয়ভাবে সংশ্লিষ্ট মডেল ইনস্ট্যান্সে রূপান্তর করতে পারেন।

আপনার যদি একটি `Post` মডেল থাকে এবং আপনি `/posts/{id}` এর মাধ্যমে কোনো পোস্ট দেখতে চান, তাহলে আগের মতো করে ম্যানুয়ালি `Post::find($id)` ব্যবহার করার প্রয়োজন নেই। Laravel নিজে থেকেই `{post}` প্যারামিটার অনুযায়ী `Post` মডেল থেকে রেকর্ড খুঁজে এনে দেয়।

---

## ✅ কেন Route Model Binding ব্যবহার করবেন?

1. **Code Clean হয়** – কম কোডে বেশি কাজ।
    
2. **Error কম হয়** – যদি রেকর্ড না পাওয়া যায়, Laravel স্বয়ংক্রিয়ভাবে 404 রেসপন্স পাঠায়।
    
3. **Security বাড়ায়** – আপনি শুধুমাত্র কাঙ্ক্ষিত মডেলই ব্যবহার করছেন।
    

---

## 🧠 Route Model Binding এর ধরন

Laravel-এ দুই ধরনের Route Model Binding রয়েছে:

### 1\. **Implicit Binding (স্বয়ংক্রিয়)**

Laravel স্বয়ংক্রিয়ভাবে URI এর `{model}` নাম দেখে সংশ্লিষ্ট মডেল ইনস্ট্যান্স খুঁজে বের করে।

#### 📌 উদাহরণ:

```plaintext
// route/web.php
use App\Models\Post;

Route::get('/posts/{post}', function (Post $post) {
    return view('posts.show', compact('post'));
});
```

এখানে `{post}` URI প্যারামিটারটি `Post` মডেলকে বুঝায়। Laravel নিজে থেকে `$post = Post::findOrFail($id)` করে দেয়।

> **শর্ত**: `{post}` নাম এবং `$post` ভ্যারিয়েবল নাম একই হতে হবে।

---

### 2\. **Explicit Binding (ম্যানুয়াল)**

আপনি যদি চাইতে URI প্যারামিটারটি অন্য কোনো কলামে (যেমন `slug`) খোঁজ করতে, তাহলে Explicit Binding ব্যবহার করতে হবে।

#### 📌 উদাহরণ:

```plaintext
// RouteServiceProvider.php ফাইলে boot() মেথডে
use App\Models\Post;
use Illuminate\Support\Facades\Route;

public function boot()
{
    Route::bind('post', function ($value) {
        return Post::where('slug', $value)->firstOrFail();
    });
}
```

```plaintext
// route/web.php
Route::get('/posts/{post}', function (Post $post) {
    return view('posts.show', compact('post'));
});
```

এখানে `{post}` এখন `slug` কলামের মাধ্যমে পোস্ট খুঁজবে।

---

## 💡 Controller এ Route Model Binding

Route Model Binding শুধুমাত্র ক্লোজার ফাংশনের জন্য নয়, কন্ট্রোলারেও কাজ করে।

```plaintext
Route::get('/posts/{post}', [PostController::class, 'show']);
```

```plaintext
// PostController.php
public function show(Post $post)
{
    return view('posts.show', compact('post'));
}
```

Laravel স্বয়ংক্রিয়ভাবে `$post` প্যারামিটারটি মডেল ইনস্ট্যান্সে রূপান্তর করে দেবে।

---

## ⚠️ যদি রেকর্ড না মেলে?

Laravel তখন স্বয়ংক্রিয়ভাবে `404 Not Found` রেসপন্স দেখাবে। এর জন্য আপনাকে কিছু করতে হবে না।

---

## 🔐 Middleware বা Policy এর সাথে ব্যবহার

Route Model Binding ব্যবহার করলে সহজেই আপনি Laravel Authorization (Policy বা Gate) এর সুবিধা নিতে পারেন।

```plaintext
public function show(User $user)
{
    $this->authorize('view', $user);
}
```

---

Laravel Route Model Binding আপনার কোডকে করে তোলে ক্লিন, স্মার্ট এবং সিকিউর। আপনি চাইলে Implicit অথবা Explicit যেকোনো একটি বেছে নিতে পারেন। প্রজেক্টের জটিলতা অনুযায়ী বেছে নিন আপনার উপযোগী উপায়।
