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
@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>
@endifAda juga directive praktis untuk cek variabel:
@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
<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:
@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>
@endforelseKesalahan Umum Pemula
1. Salah: lupa directive penutup
@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:
@foreach ($posts as $post)
<p>{{ $post->title }}</p>
@endforeach2. Salah: cek kosong manual yang bertele-tele
@if (count($komentars) > 0)
@foreach ($komentars as $komentar)
<p>{{ $komentar->isi }}</p>
@endforeach
@else
<p>Belum ada komentar.</p>
@endifBenar: pakai @forelse
@forelse ($komentars as $komentar)
<p>{{ $komentar->isi }}</p>
@empty
<p>Belum ada komentar.</p>
@endforelseLebih 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
{{-- 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:
{{ $loop->iteration }}. {{ $post->title }}Catatan teknis: Directive
@fordan@whilejuga 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@breakatau@continuedi dalam loop, keduanya didukung Blade.
Directive Tambahan yang Berguna
Selain @if dan @foreach, ada beberapa directive yang bikin hidup lebih mudah:
{{-- @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.