LaravelBladeViewPemula3 mnt baca

@include: Pecah View Jadi Bagian Kecil

Gunakan @include dan @each untuk view yang modular.

Analogi: Bongkar Pasang Puzzle

Bayangkan layout-mu adalah puzzle 1000 keping yang sudah jadi gambar utuh. Suatu hari kamu mau mengganti bagian langitnya saja. Kamu tidak akan membongkar seluruh puzzle, kamu cuma melepas kepingan langit dan menggantinya.

@include itu cara "melepas kepingan" dari view raksasa. Navbar, footer, sidebar, dan kartu produk masing-masing jadi file kecil (partial) yang bisa disisipkan ke view mana pun. View induk tetap ramping dan mudah dibaca, dan setiap partial bisa diedit tanpa menyentuh file lain.

Kenapa @include Ada?

File view yang panjangnya 500 baris itu mimpi buruk: scroll ke atas-bawah cuma untuk mencari satu tombol, dan merge conflict jadi sering. Memecahnya jadi partial membuat setiap file punya satu tanggung jawab yang jelas. Bonusnya: partial yang sama (misalnya footer) bisa dipakai ulang di banyak layout tanpa copy-paste.

Contoh 1: @include untuk Partial Statis

Pecah layout menjadi potongan kecil:

File: resources/views/partials/navbar.blade.php

php
<nav class="navbar">
    <a href="/" class="{{ request()->is('/') ? 'active' : '' }}">Beranda</a>
    <a href="/tentang" class="{{ request()->is('tentang') ? 'active' : '' }}">Tentang</a>
</nav>

File: resources/views/partials/footer.blade.php

php
<footer>
    <p>&copy; {{ $tahun }} Website Saya. Dibuat dengan Laravel.</p>
</footer>

File: resources/views/layouts/app.blade.php

php
<!DOCTYPE html>
<html>
<head>
    <title>@yield('title', 'Website Saya')</title>
</head>
<body>
    @include('partials.navbar')

    <main>
        @yield('content')
    </main>

    @include('partials.footer', ['tahun' => 2026])
</body>
</html>

Variabel dari view induk otomatis tersedia di partial, tapi mengirim secara eksplisit (['tahun' => 2026]) lebih jelas: siapa pun yang membaca partial tahu persis data apa yang dibutuhkannya tanpa harus menelusuri view induk.

Contoh 2: @each untuk Render Koleksi

Kasus klasik: menampilkan daftar kartu produk. Tanpa @each, view-mu berisi loop yang membungkus include:

php
{{-- cara manual, bertele-tele --}}
@foreach ($produks as $produk)
    @include('partials.produk-card', ['produk' => $produk])
@endforeach

@each memadatkan semuanya jadi satu baris:

File: resources/views/partials/produk-card.blade.php

php
<div class="produk-card">
    <h3>{{ $produk->nama }}</h3>
    <p>Rp {{ number_format($produk->harga, 0, ',', '.') }}</p>
</div>

File: resources/views/partials/produk-kosong.blade.php

php
<p>Belum ada produk. Cek lagi nanti ya!</p>

Pemakaian:

php
@each('partials.produk-card', $produks, 'produk', 'partials.produk-kosong')

Empat argumennya berurutan: (1) nama view untuk tiap item, (2) koleksi/array, (3) nama variabel item di dalam partial, (4) view yang ditampilkan kalau koleksinya kosong (opsional). Bersih dan tanpa @forelse manual.

Kesalahan Umum Pemula

1. Salah: over-include sampai struktur sulit dilacak

php
{{-- layouts/app.blade.php --}}
@include('partials.head')
@include('partials.navbar')
@yield('content')
@include('partials.sidebar')
@include('partials.footer')
@include('partials.scripts')

Enam level include untuk satu halaman. Mau debug tampilan? Kamu harus membuka 7 file. Include itu untuk partial yang memang berdiri sendiri (navbar, footer), bukan untuk memecah halaman menjadi serpihan tak terlacak.

Benar: pakai @include untuk partial yang dipakai ulang di banyak tempat. Untuk potongan yang butuh props atau logika, pertimbangkan component (<x-...>).

2. Salah: mengandalkan variabel induk yang tidak jelas

php
{{-- partials/produk-card.blade.php memakai $diskon... --}}
<p>Diskon: {{ $diskon }}%</p>

...yang ternyata cuma tersedia di satu view induk tertentu. Di view lain yang me-include partial ini, error Undefined variable $diskon.

Benar: kirim eksplisit.

php
@include('partials.produk-card', ['produk' => $produk, 'diskon' => 10])

3. Salah: tertukar urutan argumen @each

php
{{-- SALAH: koleksi dan nama view tertukar --}}
@each($produks, 'partials.produk-card', 'produk')

Urutan yang benar: view dulu, lalu data. @each('partials.produk-card', $produks, 'produk'). Kalau tertukar, error-nya bisa membingungkan karena Laravel mencoba me-render koleksi sebagai nama view.

Catatan teknis: @include mewarisi semua variabel view induk secara otomatis (kecuali kamu membatasinya). Kalau butuh isolasi penuh, ada @includeFirst (pilih view pertama yang ada dari daftar) dan kamu bisa membungkus partial dalam component agar datanya eksplisit lewat props.

Include Bersyarat: @includeIf dan @includeWhen

Tidak semua partial selalu ada atau selalu perlu ditampilkan. Daripada membungkus @include dengan @if, Blade punya directive khusus:

php
{{-- tampilkan hanya jika user sudah login --}}
@includeWhen(auth()->check(), 'partials.menu-user')

{{-- tampilkan kecuali sedang di halaman login --}}
@includeUnless(request()->is('login'), 'partials.promo-banner')

{{-- include hanya jika file view-nya ADA (tidak error kalau hilang) --}}
@includeIf('partials.iklan-' . $posisi)

@includeIf berguna untuk partial opsional seperti banner iklan per posisi halaman: kalau file partials/iklan-sidebar.blade.php tidak ada, halaman tetap jalan tanpa error. Pola ini menjaga view tetap tangguh saat partial-nya belum dibuat atau sudah dihapus.

Tantangan

Partialisasi

Pecah layout blog-mu: pindahkan navbar ke partials/navbar.blade.php dan footer ke partials/footer.blade.php. Layout induk tinggal @include keduanya. Pastikan halaman tetap tampil sama.

Kuis Bab

Uji pemahamanmu: Bab 3: Blade Template

Jawab 5 soal berikut, lalu tekan "Periksa Jawaban".

1.Apa beda {{ }} dan {!! !!}?

2.Directive apa yang menggabungkan foreach + empty check?

3.Apa itu $slot dalam component?

4.Pasangan yang benar untuk layout inheritance?

5.Kapan memakai @include vs component?