من المتعارف عليه في إطار العمل لارافيل أنه عندما نريد جلب / حذف / تعديل عنصر من قاعدة البيانات، إننا نقوم بتمرير $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 عوضاً عن إستخدام $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 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 فإنه يتم جلب / حذف / عرض العنصر حسب الـ 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 ✅