Episode ketiga! Setelah di episode #2 kita sudah bisa membuat route dan controller pertama, sekarang waktunya belajar Blade — template engine bawaan Laravel yang bikin kita nggak perlu copy-paste HTML bolak-balik tiap buat halaman.
Jujur, pas pertama kali pakai Blade, saya agak bingung dengan syntax @-nya. Ternyata setelah beberapa jam utak-atik, Blade itu justru sangat ramah pemula. Intinya: tulis HTML biasa, tambahin sedikit directive @ untuk logika, dan biarkan Blade menggabungkannya.
Mengapa Pakai Template Engine?
Bayangkan punya 10 halaman dengan header & footer yang sama. Tanpa template engine, kita harus menulis ulang header & footer di setiap file PHP/HTML. Dengan Blade, kita pisahkan layout (yang diulang) dan konten (yang berbeda per halaman).
Tiga konsep utama Blade yang harus dipahami:
- Layout inheritance —
@extends,@section,@yield - Conditional —
@if,@elseif,@else,@endif - Looping —
@foreach,@forelse,@endforeach
Layout dengan @extends, @section, @yield
Mari buat layout utama dulu. Di Laravel, file Blade disimpan di resources/views/. Buat file resources/views/layouts/app.blade.php:
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>@yield('title', 'Judul Default')</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<nav class="navbar navbar-dark bg-primary px-3">
<a class="navbar-brand" href="/">Catatan Rudy</a>
</nav>
<div class="container mt-4">
@yield('content')
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>Perhatikan @yield('content') — ini placeholder yang akan diisi oleh child view. Judulnya juga pakai @yield dengan default value.
Sekarang buat halaman home di resources/views/home.blade.php:
@extends('layouts.app')
@section('title', 'Beranda')
@section('content')
<h1>Selamat Datang!</h1>
<p>Ini halaman pertama saya belajar Laravel.</p>
@endsectionCukup tiga langkah: @extends untuk menyatakan pakai layout mana, @section('title', ...) untuk judul (satu baris), dan @section('content') ... @endsection untuk isi kontennya. Blade akan menggabungkan semuanya saat render.
Jangan lupa, di route-nya kita return view: return view('home'); — Laravel otomatis cari file home.blade.php.
Kondisi @if / @elseif / @else
Sama seperti if di PHP, tapi syntax-nya lebih ringkas:
@extends('layouts.app')
@section('content')
<h1>Dashboard</h1>
@if(isset($user))
<p>Halo, {{ $user['name'] }}!</p>
@else
<p>Halo, tamu! Silakan <a href="/login">login</a>.</p>
@endif
@endsectionAda juga @unless, kebalikan dari @if — berguna kalau logikanya negatif. Dan @isset($var) / @empty($var) sebagai shortcut untuk pengecekan yang sering dipakai.
Looping dengan @foreach
Seringkali data dari database berupa array/collection. Blade punya @foreach untuk mengulang data:
@extends('layouts.app')
@section('content')
<h1>Daftar Artikel</h1>
@if(count($articles) > 0)
<ul class="list-group">
@foreach($articles as $article)
<li class="list-group-item">
<strong>{{ $article['title'] }}</strong>
<br>
<small>{{ $article['date'] }}</small>
</li>
@endforeach
</ul>
@else
<p class="text-muted">Belum ada artikel.</p>
@endif
@endsectionDi controller-nya, kita kirim data sebagai array:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ArticleController extends Controller
{
public function index()
{
$articles = [
['title' => 'Belajar Routing', 'date' => '2026-08-10'],
['title' => 'Belajar Blade', 'date' => '2026-08-12'],
];
return view('articles.index', compact('articles'));
}
}Cara compact('articles') itu shortcut — secara otomatis jadi ['articles' => $articles]. Kalau suka eksplisit, boleh juga return view('articles.index', ['articles' => $articles]).
{{ }} vs {!! !!} — Output Aman vs Raw HTML
Ini bagian penting. Blade punya dua cara menampilkan variabel:
{{ $name }}— otomatis escaped (aman dari XSS). Jika$name = "<script>alert('hack')</script>", yang muncul teks biasa, bukan script jahat.{!! $name !!}— output raw (tanpa escape). Hanya pakai kalau kamu pasti isinya aman, misalnya konten HTML dari editor tepercaya.
Aturan sederhana: selalu pakai {{ }} kecuali ada alasan kuat. Keamanan lebih penting dari kenyamanan.
Kesalahan Umum Pemula
- Lupa
@endsection— Blade akan error. Setiap@sectionharus ditutup. @foreachtanpa@endforeach— sama, harus seimbang.- Nama view salah — kalau
return view('home')tapi file-nya tidak ada diresources/views/home.blade.php, errorView [home] not found. - Pakai
{!! !!}sembarangan — bisa membuka celah XSS. Kalau ragu, pakai{{ }}. - Mixing PHP & Blade — bisa pakai
@php ... @endphp, tapi sebisa mungkin pakai Blade directive. Lebih rapi, lebih mudah dibaca.
Kesimpulan
Blade itu sederhana tapi powerful. Dengan tiga konsep utama — layout inheritance, kondisi, dan looping — kita sudah bisa membuat halaman-halaman yang rapi tanpa duplikasi kode. Di episode berikutnya, kita akan refresh HTML & CSS supaya tampilan makin enak dilihat.