بدلاً من تكرار متغير في كل دالة وتجنب كثرة الاستعلام كالتالي :
public function index()
{
$categories = Categories::all();
return view('admin.products.index', compact('categories'));
}
public function create()
{
$categories = Categories::all();
return view('admin.products.create', compact('categories'));
}
هناك طرق عديده لتجنب التكرار منها تعين الاستعلام في ( construct ) لاستخدامه في كامل الكنترول،
لكن في حال اردنا تجنب نفس الاستعلام في عدة متحكمات ( controllers ) هناك طريقتين:
- ( View::share ) نشر المتغير بكامل المشروع
- ( View::composer ) تحديد القوالب المراد تمرير المتغير لها فقط
سوف استخدم في هذا المثال طريقة ( View::composer )
الطريقة هي انشاء كلاس ( CategoryComposer ) في مجلد ( Http / View / Composers ) مثال:
<?php
namespace App\Http\View\Composers;
use App\Models\Category;
use Illuminate\View\View;
class CagegoryComposer
{
/**
* Bind data to the view.
*
* @param \Illuminate\View\View $view
* @return void
*/
public function compose(View $view)
{
$view->with('categories', Category::all());
}
}
ومن ثم تحديد قالب او عدة قوالب وتمرير المتغير لها من خلال البوت ميثود ( boot method ) ملف ( AppServiceProvider.php )، كالتالي:
public function boot()
{
View::composer(['admin.products.index', 'admin.products.create'], CategoryComposer::class);
}
الان يمكن للقوالب التي تم تحديدها في ملف ( AppServiceProvider.php ) ان تصل لقيمة المتغير بشكل افتراضي دون الحاجة للاستعلام من الكنترولر .
اصبح الكنترولر كالتالي :
public function index()
{
return view('admin.products.index');
}
public function create()
{
return view('admin.products.create');
}