Blade: Template Engine
Menulis tampilan dinamis dengan Blade: echo aman, direktif, loop, kondisi, dan form dengan @csrf.
Blade: HTML + sedikit sihir
Blade adalah template engine bawaan Laravel. Berkasnya berekstensi .blade.php di resources/views. Isinya HTML biasa yang diperkaya sintaks ringkas; Laravel mengompilasinya menjadi PHP murni dan menyimpan cache-nya, jadi sangat cepat.
return view('produk.index', ['produk' => $produk]); // resources/views/produk/index.blade.php
Titik pada nama view (produk.index) mewakili sub-folder.
Menampilkan data: {{ }}
<h1>{{ $produk->nama }}</h1>
<p>Rp{{ number_format($produk->harga, 0, ',', '.') }}</p>
<p>Tahun: {{ now()->year }}</p>
{{ ... }} otomatis di-escape (karakter < > & diubah menjadi entitas HTML), sehingga aman dari serangan XSS. Untuk menampilkan HTML mentah yang kamu percayai: {!! $html !!} — hati-hati, jangan pernah dipakai untuk input pengguna.
Jika framework JavaScript juga memakai {{ }} (Vue/Alpine), awali dengan @: @{{ nama }} agar Blade membiarkannya.
Kondisi
@if ($produk->stok > 10)
<span>Stok aman</span>
@elseif ($produk->stok > 0)
<span>Hampir habis</span>
@else
<span>Habis</span>
@endif
@unless ($user->aktif) Akun nonaktif @endunless
@isset($produk->diskon) ... @endisset
@auth Halo, {{ auth()->user()->name }} @endauth
@guest <a href="/login">Masuk</a> @endguest
Perulangan
@foreach ($produk as $item)
<li>{{ $loop->iteration }}. {{ $item->nama }}</li>
@endforeach
@forelse ($produk as $item)
<li>{{ $item->nama }}</li>
@empty
<li>Belum ada produk.</li>
@endforelse
Di dalam loop tersedia objek $loop: index (mulai 0), iteration (mulai 1), first, last, count, dll. @forelse sangat praktis: ada bagian khusus saat datanya kosong.
Form dan keamanan
<form method="POST" action="{{ route('produk.store') }}">
@csrf {{-- token CSRF wajib untuk POST/PUT/PATCH/DELETE --}}
<input name="nama" value="{{ old('nama') }}">
@error('nama') <small>{{ $message }}</small> @enderror
<button>Simpan</button>
</form>
<form method="POST" action="{{ route('produk.update', $produk) }}">
@csrf
@method('PUT') {{-- menyamarkan POST sebagai PUT --}}
</form>
Tanpa @csrf Laravel menolak form dengan error 419 Page Expired. old('nama') mengembalikan input sebelumnya saat validasi gagal.
Komentar dan PHP
{{-- komentar Blade: tidak ikut ke HTML --}}
@php $total = $a + $b; @endphp
Menyertakan view lain
@include('partials.navbar')
@include('produk.kartu', ['produk' => $item])
Data ke JavaScript
<script>
const data = @json($produk); // meng-encode aman ke JSON
</script>
Layout, komponen, dan slot dibahas di bab berikutnya. Catatan: berkas Blade tidak berisi tag <?php, sehingga pemeriksa sintaks PHP selalu lolos; penilaian latihan Blade berdasarkan struktur yang kamu tulis.