مارک پلاس

تکنولوژی نوین اینترنتی

استفاده از Route Model Binding

دسته‌بندی‌ها

استفاده از Route Model Binding
استفاده از Route Model Binding


بزن بریم سراغ یکی از خوشگل‌ترین و کاربردی‌ترین امکانات لاراول:

🔁 Route Model Binding

این قابلیت باعث می‌شه به‌جای گرفتن id از URL و بعد دستی پیدا کردن مدل، خود لاراول به‌صورت خودکار مدل مربوطه رو از دیتابیس پیدا کنه و به اکشن کنترلر بفرسته.


✅ ۱. Route Model Binding ساده (Implicit Binding)

مثال:

php
// routes/web.php Route::get('/posts/{post}', [PostController::class, 'show']);

در کنترلر:

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

لاراول خودش Post::findOrFail($id) رو اجرا می‌کنه! ✨
{post} با نام متغیر $post مطابقت داره و مدل Post به اون bind می‌شه.


🔍 پشت پرده

وقتی می‌نویسی {post}، لاراول می‌فهمه که باید از مدل Post استفاده کنه و مقدار id در URL رو تو جدول posts جستجو کنه.


🛠 شرط: نام پارامتر باید با نام متغیر مدل یکی باشه

php
Route::get('/users/{user}', fn(User $user) => $user->name);

✅ ۲. Route Model Binding صریح (Explicit Binding)

وقتی می‌خوای بر اساس فیلد دیگه‌ای غیر از id مدل رو بیاری (مثلاً slug) ⬇️

🧩 تعریف در RouteServiceProvider

php
use App\Models\Post; public function boot() { parent::boot(); Route::bind('post', function ($value) { return Post::where('slug', $value)->firstOrFail(); }); }

🛤 روت

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

حالا لاراول به جای id، دنبال پستی با slug = $value می‌گرده.


✅ استفاده از getRouteKeyName() در مدل

راه بهتر برای Binding با slug:

php
// در مدل Post.php public function getRouteKeyName() { return 'slug'; }

الان بدون نیاز به تغییر در RouteServiceProvider:

php
// URL: /posts/hello-world Route::get('/posts/{post}', [PostController::class, 'show']);

و کنترلر:

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

✅ در API ها هم همینطور:

php
Route::get('/api/posts/{post}', fn(Post $post) => new PostResource($post));

🧨 خطا اگر پیدا نشه؟

لاراول خودش به‌صورت خودکار 404 برمی‌گردونه اگر چیزی پیدا نکنه.
نیازی به findOrFail نداری.


✅ ترکیب با روابط Eloquent:

php
Route::get('/users/{user}/posts/{post}', function(User $user, Post $post) { return $user->posts->find($post->id); });

البته تو این حالت باید اطمینان داشته باشی که پست واقعاً متعلق به اون یوزر هست.


✨ مزایای Route Model Binding

ویژگیمزیت
کوتاه‌تر شدن کد کنترلرحذف findOrFail
امنیتاگر پیدا نشه => 404
قابلیت استفاده با slug و uuidبا getRouteKeyName()
ترکیب عالی با Resourceهاخروجی زیباتر برای API

اگه خواستی یه مثال واقعی با مدل‌های Post, Category, User و slug بسازم و چند تا route حرفه‌ای بنویسم، فقط بگو 😉

محتوای مرتبط

پست‌های مرتبط