زمانی که شما با لاراول هم فرانت اند و هم بک اند رو می زنید خیلی موقع ها نیاز هست که یک متغیر به چند view پاس داده بشه که همین امر باعث میشه که شما چندین بار اون متغیر رو در controller های مختلف تعریف کنید و به view های مختلف ارسال کنید
به عنوان مثال در کد زیر ما یک متغیری به نام menus$ داریم و میخوام در چند View از آن استفاده کنیم
public function index()
{
$menus = Menu::get();
return view('home',compact('menus'));
}
و چون در تمامی صفحه ها باید از این متغیر استفاده کنیم باید آن را در تمام controller ها استفاده کنیم
View Composer چیست
شما کافیه یک provider بسازی و در اون مشخص کنی که هر باری که این View ها (view های مد نظر من) صدا زده شد این متغیر رو به view ارسال کن
ابتدا باید با دستور زیر یک provider بسازید
البته شما میتونید یک provider نسازید و دستور خودتون رو داخل AppServiceProvider بزنید که بهتره یک provider بسازید تا کد شما خواناتر و مرتب تر باشد
php artisan make:provider ViewServiceProvider
در دستور بالا ما تونستیم یک provider در مسیر \App\Providers بسازیم
حالا در ادامه کافیه تا view ها , متغیر های مورد نظر خودمون رو مشخص کنیم تا کار رو تموم کنیم
namespace App\Providers;
use App\Models\Category;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class ViewServiceProvider extends ServiceProvider
{
// ...
public function boot()
{
View::composer('home', function($view) {
$menus = Menu::all();
$view->with([
'menus' => $menus,
]);
});
}
}
همانطو رکه در مد بالا مشخص است به متغیر menus$ رو به view home پاس دادیم
اگر بخواهیم چندین view رو مشخص کنیم تا متغیر موردنظر ما به همه آن ها ارسال بشه کافیه تا view ها را داخل یک آرایه بزاریم
View::composer(['home', 'footer','header'], ... );
و اگر هم بخواهیم که در متغیر خودمون رو در تمامی view ها ارسال کنیم باید از دستور زیر استفاده کنیم
View::composer('*', ... );
به همین راحتی تونستیم از view composer ها استفاده کنیم:)