ما هو Route Model Binding في لارافيل؟ وكيفية إستخدامة؟

ما هو Route Model Binding في لارافيل؟ وكيفية إستخدامة؟

2024-05-14 وقت القراءه : 2 دقائق

ما هو Route Model Binding في لارافيل.؟

من المتعارف عليه في إطار العمل لارافيل أنه عندما نريد جلب / حذف / تعديل عنصر من قاعدة البيانات، إننا نقوم بتمرير $id للدالة، على سبيل المثال إذا أردنا عرض تفاصيل قسم معين

public function show($id){
    return Category::where('id',$id)->first();
}


إلا إنه في إطار العمل لارافيل، يمكن لنا إستخدام ميزة Route Model Binding، فعوضاً عن تمرير $id القسم، يمكن لنا تمرير object من الموديل، وتلقائيا تقوم لارافيل بالتعامل حسب $id.

public function show(Category $category){
    return $category;
}


كيفية إنشاء Controller مع Route Model Binding

لإنشاء Controller يكون محضر مسبقاً للتعامل مع Route Model Binding عوضاً عن إستخدام $id يمكن لنا إضافة الخيار --resource ومن ثم تحديد إسم الـ model ، --model=Product

php artisan make:controller ProductController --resource --model=Product

هنا يتم إنشاء Controller وإضافة Route Model Binding للدوال

public function show(Product $product){}

public function edit(Product $product){}

public function update(Request $request, Product $product){}

public function destroy(Product $product){}


إنشاء Route عند إستخدام Route Model Binding

عنند إنشاء route يجب أن يتوافق الـ route مع Model Object

على سبيل المثال في الـ controller الذي تم إنشاؤه بالأعلى ProductController نلاحظ في الدوال أن الـ object Model هو Product $product لذلك يجب ان يكون route بالمسار product أو products

Route::resource('products', ProductController::class);

كذلك إذا أردنا إضافة دالة جديدة، مثلا تصدير المنتج لملف excell

public function export(Product $product){}

ويجب ان يكون الـ route مشابه للـ Model Object

Route::get('/product/{product}/export', [ProductController::class,'export']);


تخصيص الحقول عند إستخدام Route Model Binding

كما تم الحديث مسبقاً أنه بشكل تلقائي عند إستخدام Route Model Binding فإنه يتم جلب / حذف / عرض العنصر حسب الـ id، لكن ماذا إن أردنا أن يتم تغيير ذلك، ليكن حسب slug مثلا، بحيث أقوم بتمرير slug وليس id

١- القيام بذلك على route محدد

من خلال ملف web.php يمكن القيام بذلك لـ route معين، من خلال تمرير إسم الحقل (slug)، إلى الـ route

Route::get('/product/{product:slug}/export', [ProductController::class,'export']);


٢- تحديد ذلك لجميع الـ model

حيث يجب إضافة دالة getRouteKeyName

class Product extends Model
{
    use HasFactory;


    public function getRouteKeyName()
    {
        return 'slug';
    }
}


تخصيص صفحة الأخطاء

في لارافيل عند جلب / حذف / تعديل عنصر، إن لم يكن هذا العنصر موجود فإنه يتم إرجاع 404 | NOT FOUND، لكن كيف يمكن تخصيص ذلك عند إستخدام Route Model Binding

يمكن لنا تخصيص ذلك من خلال إضافة missing إلى الـ route

Route::get('/product/{product}/export', [ProductController::class,'export'])->missing(function (){
    return view('notfound');
});



التعليقات
زائر
منذ سنتين

To be honest, the way you simplified the topics is great ✅

زائر
منذ سنتين

مرحبا و شكرا لك علي هذا الموقع لدي بعض الاشياء التي لم افهمها هل يمكنك مساعدتي؟

إضافة تعليق
Loading...