LaravelBladeDirectivePemula4 mnt baca

Directive If dan Loop di Blade

Kondisional @if, @foreach, @forelse, dan @while dengan sintaks bersih.

Analogi: Daftar Hadir dan Seleksi Kelas

Bayangkan kamu jadi ketua panitia yang memegang daftar hadir. Tugasmu: tulis "LULUS" di samping nama yang nilainya 75 ke atas, "REMEDIAL" untuk yang di bawahnya. Kalau daftarnya kosong, tulis "BELUM ADA DATA" di papan.

Itu persis yang dilakukan directive kondisional dan loop di Blade: @if untuk keputusan, @foreach untuk mengulang daftar, @forelse untuk daftar yang mungkin kosong. Tanpa directive ini, kamu harus menulis blok <?php ... ?> yang berisik di tengah HTML.

Kenapa Directive Ini Ada?

PHP murni memaksa kamu membuka-tutup tag PHP setiap kali butuh logika di tengah HTML. Hasilnya seperti mie instan yang kusut: susah dibaca, gampang salah tutup tag. Directive Blade (@if, @foreach, dan kawan-kawan) adalah "jalan pintas resmi" yang di-compile jadi PHP biasa, jadi kamu dapat keterbacaan tanpa kehilangan kekuatan.

Contoh 1: Kondisional @if, @elseif, @else

File: resources/views/nilai.blade.php

php
@if ($nilai >= 90)
    <span class="badge gold">Sempurna!</span>
@elseif ($nilai >= 75)
    <span class="badge green">Lulus</span>
@elseif ($nilai >= 60)
    <span class="badge yellow">Remedial ringan</span>
@else
    <span class="badge red">Remedial</span>
@endif

Ada juga directive praktis untuk cek variabel:

php
@isset($nama)
    <p>Halo, {{ $nama }}!</p>
@endisset

@empty($posts)
    <p>Belum ada artikel.</p>
@endempty

@isset lolos kalau variabel ada dan tidak null, @empty lolos kalau variabel kosong (array kosong, string kosong, null, atau tidak ada sama sekali).

Contoh 2: Loop @foreach, @forelse, dan Variabel $loop

File: resources/views/posts/index.blade.php

php
<table>
    @foreach ($posts as $post)
        <tr class="{{ $loop->even ? 'genap' : 'ganjil' }}">
            <td>{{ $loop->iteration }}</td>
            <td>{{ $post->title }}</td>
            <td>
                @if ($loop->first)
                    <span>Post pertama!</span>
                @endif
            </td>
        </tr>
    @endforeach
</table>

Di dalam setiap loop, Blade menyediakan variabel ajaib $loop dengan info berguna: $loop->iteration (nomor urut mulai dari 1), $loop->index (mulai dari 0), $loop->first, $loop->last, $loop->even, $loop->odd, dan $loop->count (total item). Untuk loop bersarang, $loop->parent mengakses info loop luar.

Kalau koleksinya bisa kosong, @forelse lebih rapi daripada @if + @foreach manual:

php
@forelse ($komentars as $komentar)
    <div class="komentar">
        <strong>{{ $komentar->nama }}</strong>
        <p>{{ $komentar->isi }}</p>
    </div>
@empty
    <p>Belum ada komentar. Jadilah yang pertama!</p>
@endforelse

Kesalahan Umum Pemula

1. Salah: lupa directive penutup

php
@foreach ($posts as $post)
    <p>{{ $post->title }}</p>
{{-- @endforeach ketinggalan! --}}

Blade akan error saat compile. Setiap @if butuh @endif, setiap @foreach butuh @endforeach, setiap @forelse butuh @endforelse. Kalau error-nya menunjuk baris aneh di file cache, biasanya ada directive yang tidak tertutup.

Benar:

php
@foreach ($posts as $post)
    <p>{{ $post->title }}</p>
@endforeach

2. Salah: cek kosong manual yang bertele-tele

php
@if (count($komentars) > 0)
    @foreach ($komentars as $komentar)
        <p>{{ $komentar->isi }}</p>
    @endforeach
@else
    <p>Belum ada komentar.</p>
@endif

Benar: pakai @forelse

php
@forelse ($komentars as $komentar)
    <p>{{ $komentar->isi }}</p>
@empty
    <p>Belum ada komentar.</p>
@endforelse

Lebih pendek, lebih jelas maksudnya, dan tidak perlu memanggil count() yang sebenarnya me-load seluruh koleksi ke memori cuma untuk dicek.

3. Salah: tertukar $loop->iteration dan $loop->index

php
{{-- Menampilkan "0. Artikel pertama" --}}
{{ $loop->index }}. {{ $post->title }}

Untuk penomoran yang dilihat manusia (mulai dari 1), pakai $loop->iteration. $loop->index mulai dari 0 dan cocok untuk kebutuhan teknis seperti akses array.

Benar:

php
{{ $loop->iteration }}. {{ $post->title }}

Catatan teknis: Directive @for dan @while juga tersedia untuk kasus khusus (@for ($i = 0; $i < 10; $i++)), tapi di praktiknya jarang dipakai di view karena logika perulangan angka biasanya disiapkan di controller. Kalau kamu butuh @break atau @continue di dalam loop, keduanya didukung Blade.

Directive Tambahan yang Berguna

Selain @if dan @foreach, ada beberapa directive yang bikin hidup lebih mudah:

php
{{-- @unless: kebalikan @if, lolos kalau kondisi SALAH --}}
@unless ($user->isAdmin())
    <p>Kamu bukan admin.</p>
@endunless

{{-- ternary untuk kondisi satu baris --}}
<span class="{{ $nilai >= 75 ? 'lulus' : 'remedial' }}">
    {{ $nilai >= 75 ? 'Lulus' : 'Remedial' }}
</span>

{{-- @switch untuk banyak cabang nilai pasti --}}
@switch($level)
    @case('admin')
        <p>Akses penuh</p>
        @break
    @case('editor')
        <p>Bisa menulis artikel</p>
        @break
    @default
        <p>Pembaca biasa</p>
@endswitch

@unless enak dibaca untuk kondisi negatif ("kecuali dia admin"), ternary cocok untuk pilihan dua nilai dalam satu baris, dan @switch lebih rapi daripada rantai @elseif yang panjang untuk satu variabel.

Tantangan

Tabel Nilai

Kirim array siswa (nama + nilai) ke view. Tampilkan sebagai tabel HTML: kolom No ($loop->iteration), Nama, Nilai, Status (@if nilai >= 75 'Lulus' else 'Remedial'). Kalau array kosong, tampilkan 'Belum ada data' via @forelse.