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

کلاس View Composer

namespace App\View\Composers;
use Illuminate\View\View;
use App\Models\Category;

final class SidebarComposer {
    public function compose(View $view): void {
        $view->with('categories', Category::query()
            ->where('active', true)->orderBy('name')->get());
    }
}

ثبت در ComposerProvider یا ViewComposerProvider

namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\View;
use App\View\Composers\SidebarComposer;

final class ComposerProvider extends ServiceProvider {
    public function boot(): void {
        View::composer('partials.sidebar', SidebarComposer::class);
    }
}

Provider سفارشی را باید طبق نسخه پروژه در فهرست Providerها ثبت کنید. در نسخه‌های جدید لاراول می‌توان همین Binding را در AppServiceProvider نوشت.

مصرف در Blade

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

هزینه کوئری را فراموش نکنید

ویو کامپوزر ممکن است در هر رندر چند بار اجرا شود. اگر داده مشترک و کم‌تغییر است، Cache یا Eager Loading را بررسی کنید.

برای آشنایی با بلید و سرویس پرووایدر به مدخل‌های مرتبط مراجعه کنید.