Blade adalah template engine Laravel — menulis HTML dengan fitur PHP yang lebih elegan.
Menampilkan variabel:
<h1>{{ $title }}</h1>
<p>{{ $user->name }}</p>
<!-- Escape HTML otomatis (aman dari XSS) -->
{{ $userInput }}
<!-- Tanpa escape (hati-hati!) -->
{!! $htmlContent !!}
Kondisional:
@if ($user->isAdmin())
<span>Admin</span>
@elseif ($user->isEditor())
<span>Editor</span>
@else
<span>User</span>
@endif
Loop:
@foreach ($users as $user)
<div>{{ $user->name }}</div>
@endforeach
@forelse ($posts as $post)
<div>{{ $post->title }}</div>
@empty
<p>Belum ada post.</p>
@endforelse
Layout & Inheritance:
<!-- layouts/app.blade.php -->
<html>
<body>
@yield("content")
</body>
</html>
<!-- pages/home.blade.php -->
@extends("layouts.app")
@section("content")
<h1>Home Page</h1>
@endsection
Blade Components — Reusable UI Building Blocks
@extends / @section cocok untuk layout global. Tapi untuk UI yang dipakai berulang (button, card, alert, modal), pakai Blade Components — lebih composable, reusable, dan punya props yang jelas.
Anonymous components (cepat, tanpa class):
# Buat file resources/views/components/alert.blade.php
{{-- resources/views/components/alert.blade.php --}}
<div class="alert alert-{{ $type ?? "info" }}">
<strong>{{ $title }}</strong>
<p>{{ $slot }}</p>
</div>
Pakai di view lain dengan tag <x-nama-komponen>:
<x-alert type="success" title="Berhasil!">
Data berhasil disimpan.
</x-alert>
<x-alert type="error" title="Gagal">
Email sudah terdaftar.
</x-alert>
Class-based components (untuk logic/preparation):
php artisan make:component Button
// app/View/Components/Button.php
namespace App\View\Components;
use Illuminate\View\Component;
class Button extends Component
{
public function __construct(
public string $type = "primary",
public string $size = "md",
public bool $disabled = false,
) {}
public function classes(): string
{
return "btn btn-{$this->type} btn-{$this->size}"
. ($this->disabled ? " opacity-50" : "");
}
public function render()
{
return view("components.button");
}
}
{{-- resources/views/components/button.blade.php --}}
<button class="{{ $classes() }}" @disabled($disabled)>
{{ $slot }}
</button>
{{-- Di view manapun --}}
<x-button type="primary" size="lg">Simpan</x-button>
<x-button type="danger" :disabled="true">Hapus</x-button>
Named slots untuk multi-area konten:
{{-- components/card.blade.php --}}
<div class="card">
<header>{{ $header }}</header>
<main>{{ $slot }}</main>
<footer>{{ $footer }}</footer>
</div>
{{-- Pakai: --}}
<x-card>
<x-slot:header>
<h2>Profil User</h2>
</x-slot>
<p>Isi konten utama di sini.</p>
<x-slot:footer>
<button>Simpan</button>
</x-slot>
</x-card>
Attribute bag $attributes untuk forward props ke element dalam component:
{{-- components/input.blade.php --}}
<input {{ $attributes->merge(["class" => "border rounded px-3 py-2"]) }}>
{{-- Pakai — class "w-full" digabung dengan default --}}
<x-input type="email" class="w-full" placeholder="[email protected]">
Kapan pakai apa:
@extends/@section |
Blade Components | |
|---|---|---|
| Layout global (header/footer/sidebar) | ✓ ideal | OK tapi overkill |
| UI element (button, card, alert) | ❌ clunky | ✓ ideal |
| Complex dengan logic | ❌ | ✓ class-based |
| Simple wrapper | ❌ | ✓ anonymous |
Rule of thumb: layout global pakai @extends. Semua UI yang reusable, pakai component. Laravel 11+ sangat push ke arah components.