سلام دوستان. توی هر برنامه‌ای View هایی وجود داره که همگانی هستن. برای مثال هدر و فوتر برنامه که ما اونها رو توی هر صفحه‌ای داریم و معمولاً اطلاعاتی رو برای نمایش دادن به اونها پاس می‌دیم. مثلاً می‌خوایم توی هدر دسته‌بندی‌های مقالات رو نمایش بدیم.

فایل header.blade.php رو در نظر بگیرید که داریم تو اون دسته‌بندی‌ها رو نمایش می‌دیم:

<ul>
  @foreach($categories as $category)
    <li>{{ $category->title }}</li>
  @endforeach
</ul>

فایل Master زیر رو در نظر بگیرید ما توی خط ۵ هدر رو include کردیم:

<!doctype html>
<html>
<body>
    <div id="app">
        @include('shared.header')
        <main>
            @yield('content')
        </main>
    </div>
</body>
</html>

حالا هر زمانی که داریم یک ویو رو نشون می‌دیم، باید دسته‌بندی‌ها رو بصورت زیر به ویو پاس بدیم:

Route::get('/', function() {
    return view('home', ['categories' => Categories::all()] );
});

Route::get('/posts', function() {
    return view('posts', ['categories' => Categories::all()] );
});

Route::get('/contact', function() {
    return view('contact', ['categories' => Categories::all()] );
});

حالا تصور کنید که برنامه بزرگ‌تر میشه و همچنین اطلاعات دیگه‌ای هم باید توی هدر و فوتر نمایش داده بشن. این کار اصلاً جالب نیست که توی هر return view() که داریم اطلاعات همگانی رو پاس بدیم. لاراول فریم‌ورکی هست که معمولاً فکر این چیزا رو کرده و یک ویژگی به اسم View Composer رو در اختیار ما قرار گذاشته 😉

 

View Composer چیه؟ 🤔

ما می‌تونیم یک کلاس یا یک تابع Callback رو به فریم‌ورک شناسایی کنیم و مشخص کنیم زمانی برای ما اجرا بشن که وقتی یک View خاص در حال رندر شدن هست. به این کلاس یا تابع می‌‌گن ویوکامپوزر (View Composer).

 

نوشتن یک ویوکامپوزر

ویوکامپوزرها معمولاً توی Service Provider ها تعریف میشن. بهتره که برای این کار یک پرووایدر (Provider) اختصاصی درست کنیم. دستور زیر رو توی خط فرمان اجرا می‌کنیم:

php artisan make:provider ViewServiceProvider

این پرووایدر توی مسیر app/Providers برامون ساخته میشه.

مرحله بعد باید این پرووایدر رو به فریم‌ورک شناسایی کنیم. توی فایل config/app.php و در قسمت providers خط ۵ کد زیر رو اضافه می‌کنیم:

// ...

'providers' => [
    // ...
    \App\Providers\ViewServiceProvider::class,
],