Laravel Blade Components Slots View Composers View Models
Selesai membaca dokumentasi ini?
Kembali ke rujukan utama Laravel untuk melanjutkan topik lainnya.
Kembali ke rujukan utama Laravel untuk melanjutkan topik lainnya.
Blade memberi beberapa cara untuk merapikan layer view. Empat pola yang paling sering muncul adalah Blade components, slots, view composers, dan view models. Keempatnya sama-sama membantu menjaga template tetap sehat, tapi perannya berbeda.
Kalau dipakai dengan tepat, kita bisa memisahkan:
Kalau dipakai sembarangan, view justru pelan-pelan berubah jadi tempat campur aduk antara markup, query, formatting, dan keputusan bisnis kecil.
Blade component adalah potongan view yang bisa dipakai ulang sebagai tag atau include terstruktur. Tujuannya bukan cuma menghindari duplikasi HTML, tapi juga membuat batas tanggung jawab UI lebih jelas.
Contoh bentuk umum:
<x-alert type="success">
Berhasil menyimpan data.
</x-alert>Slot adalah tempat isi dinamis yang dimasukkan ke dalam component dari luar. Slot membuat component tetap reusable tanpa memaksa semua isi ditulis lewat atribut.
View composer adalah callback atau class yang menyiapkan data untuk view tertentu sebelum view dirender. Ini berguna kalau beberapa view selalu butuh data yang sama dan data itu lebih cocok disiapkan dari luar template.
View model adalah objek yang khusus menyiapkan data untuk view. Ia biasanya mengambil data domain lalu mengubahnya menjadi bentuk yang enak dipakai template: string yang sudah diformat, boolean untuk state UI, daftar item yang sudah dirapikan, atau label yang sudah dipetakan.
Pakai Blade component kalau kamu ingin menyatukan struktur markup yang berulang.
Cocok untuk:
Blade component membantu saat:
Jangan pakai component kalau:
Kalau yang kamu ulang adalah bentuk UI, pakai component. Kalau yang kamu ulang adalah logika data, pikirkan view model atau composer.
Blade component menerima:
Urutannya sederhana:
Slot adalah mekanisme untuk menyisipkan isi ke dalam component.
Default slot adalah konten di antara tag pembuka dan penutup component.
<x-card>
<p>Isi kartu ini.</p>
</x-card>Di dalam component, isi itu biasanya ditampilkan dengan:
<div class="card">
{{ $slot }}
</div>Named slot dipakai kalau component punya lebih dari satu area isi.
<x-modal>
<x-slot:title>
Hapus data
</x-slot:title>
<p>Data ini tidak bisa dikembalikan.</p>
</x-modal>Di component:
<div class="modal">
<h2>{{ $title }}</h2>
<div>{{ $slot }}</div>
</div>Slot lebih pas kalau isinya:
Kalau isinya hanya nilai sederhana seperti label, class, atau status, prop biasanya lebih bersih.
View composer membantu kalau ada data yang:
Contoh umum:
Pakai composer kalau:
Jangan jadikan composer tempat semua hal.
Hindari composer kalau:
View composer bagus untuk data pelengkap presentasi, bukan untuk memindahkan semua logic dari controller.
View model cocok kalau template butuh data yang sudah dibentuk khusus untuk presentasi.
Contoh kasus:
@if, @switch, ternary yang berulangDiagram di atas menunjukkan urutan besar yang biasanya terjadi. Composer bekerja di tahap render view, sedangkan component dan slot menyusun markup final.
Pola yang sehat biasanya seperti ini:
Contoh pembagian kerja:
Invoicetotal_formatted, status_label, dan can_paysidebarLinks<x-invoice-summary> merender blok ringkasan{{-- resources/views/components/button.blade.php --}}
<button {{ $attributes->merge(['class' => 'btn']) }}>
{{ $slot }}
</button>Pemakaian:
<x-button class="btn-primary">
Simpan
</x-button><x-panel>
<x-slot:header>
Detail pengguna
</x-slot:header>
<p>Nama: {{ $user->name }}</p>
</x-panel>use Illuminate\Support\Facades\View;
View::composer('layouts.app', function ($view) {
$view->with('navLinks', [
['label' => 'Dashboard', 'url' => route('dashboard')],
[
final class UserProfileViewModel
{
public function __construct(private readonly User $user) {}
public function name(): string
{
return $this->user->name ?: $this->
Ini bagian yang paling sering bikin view Laravel pelan-pelan berantakan.
Kalau Blade mulai berisi perhitungan status, filtering data, atau branching kompleks, view sudah terlalu berat.
Tanda-tandanya:
@if bertumpukComponent seharusnya fokus pada UI. Kalau component mulai query database, akses service yang kompleks, atau memutuskan business rule utama, batas tanggung jawabnya sudah kabur.
View composer yang terlalu pintar bikin dependency sulit dilacak. View tampak “bersih”, tapi data datang dari tempat yang tidak langsung terlihat.
Template biasanya butuh data yang sudah dipermudah. Kalau semua data domain dilempar mentah ke view, template akan menanggung terlalu banyak tanggung jawab.
Format tanggal, mata uang, status label, dan fallback text yang diulang di banyak view adalah sinyal kuat untuk pindah ke view model atau helper yang lebih jelas.
Pilih begini:
Kalau satu halaman punya semua masalah sekaligus, jangan dipaksa diselesaikan dengan satu pola saja. Pisahkan sesuai tugasnya.
Kalau tujuan utamanya menjaga maintainability, aturan paling aman adalah: view hanya merakit tampilan, bukan menyelesaikan semua logic.