Halo semua? apa kabarnya nih? semoga dengan kondisi saat ini, kita tetap di berikan kesehatan dan rezeki agar tentu bisa selalu support orang yang di rumah dan diri sendiri tentunya.
Kali ini kita akan bahas lagi soal Laravel, yaitu Controller dan View. Sebelumnya kita sempat juga membahas sedikit soal MVC, yaitu VC adalah singkatan dari Model-View-Controller
Abang ingatkan lagi, itu adalah sebuah pola arsitektur yang memisahkan logika aplikasi menjadi tiga bagian utama. Kalau kamu yang bingung bisa baca disini yah:
Nah kali ini kita akan membahas lebih detail lagi karena sebelum ini juga kita sudah bahas bagaimana request masuk lalu diarahkan ke tempat yang benar.
Tapi masih ada yang menggantung, karena setelah request sampai, logikanya ditulis di mana dan siapa yang mengurus tampilannya.
Ibaratnya kalau route itu papan penunjuk jalan, Controller adalah orang yang mengerjakan tugasnya, View adalah hasil yang akhirnya dilihat pengunjung, dan Blade adalah cara menulis View.
Oke deh, daripada berlama-lama lagi mari kita bahas tuntas! So lets check this out!
Penempatan Logika ke Dalam Controller
Waktu baru belajar, godaan terbesar adalah menulis semuanya langsung di routes/web.php:
Route::get('/produk', function () {
$produk = ['Kopi', 'Teh', 'Cokelat'];
// ... logika panjang di sini
return view('produk', ['produk' => $produk]);
});Untuk satu sampai dua halaman, cara ini masih aman. Masalahnya muncul waktu aplikasi sudah punya ada belasan halaman dan file route jadi panjang.
Ketika tracking pun mencari satu bagian saja terasa sulit karena tidak terlihat secara langsung dan errornya pun makin tinggi karena syntax menjadi tidak rapih saat development.
Maka dengan adanya Controller yang dimana dapat untuk menampung logika tersebut dan bisa di bagi-bagi juga menjadi beberapa Controller untuk maintain setiap View yang ada.
Jadi pertama Laravel ada namanya perintah yang disebut dengan artisan. Ini perintah yang bisa membuat kita tidak perlu lagi membuat secara manual.
Perintah ini bisa kamu jalankan di comment prompt dan sebagai contohnya seperti ini:
php artisan make:controller ProdukControllerSetelah dijalankan, muncul file baru di app/Http/Controllers/ProdukController.php. Isinya nanti ada formatnya seperti ini:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ProdukController extends Controller
{
//
}Nah nanti di dalamnya kamu bisa bentuk CRUD atau dasar dari logika yang akan kamu bangun. Sekarang kita isi satu method, pertama coba casenya kita sedang membuat toko kecil dan ingin menampilkan daftar produk. Maka isinya:
class ProdukController extends Controller
{
public function index()
{
$produk = ['Kopi', 'Teh', 'Cokelat', 'Susu'];
return view('produk.index', ['produk' => $produk]);
}
}Method index() ini melakukan tiga hal:
- Menyiapkan data, yaitu daftar produk.
- Memanggil view bernama produk.index.
- Mengirim $produk ke view tersebut.
Titik di produk.index artinya file-nya ada di folder produk dengan nama index. Jadi berikutnya kita akan membuat View untuk menampilkan index tersebut.
Menghubungkan Route ke Controller
Controller-nya sudah ada, tapi belum ada yang memanggil. Ini diperlukan karena Route belum mengenali adanya Controller tersebut. Maka buka routes/web.php, lalu kita buat komunikasinya.
use App\Http\Controllers\ProdukController;
Route::get('/produk', [ProdukController::class, 'index']);Artinya, kalau ada yang membuka /produk, Laravel menjalankan method index() di ProdukController. Setelah ini Route sudah mengenali adanya Controller yang bernama Controller dan di dalamnya ada yang namanya index.
Besar kecilnya nama atau variabel fungsinya harus konsisten dan sama yah, kalau tidak maka Route tidak akan mengenalinya.
Pembangun View
Semua file tampilan Laravel disimpan di resources/views. Karena tadi controller memanggil produk.index, kita buat file resources/views/produk/index.blade.php.
<!DOCTYPE html>
<html>
<head>
<title>Daftar Produk</title>
</head>
<body>
<h1>Produk Kami</h1>
<p>Ini halaman daftar produk.</p>
</body>
</html>Jalankan php artisan serve, lalu buka http://localhost:8000/produk. Halaman “Produk Kami” seharusnya sudah dapat tampil. Apabila berhasil maka jalurnya sudah tersambung dari Route > Controller > View.
Sebelumnya pasti kamu akan bertanya, kenapa Blade? apakah bisa Laravel membuat View tidak dengan Blade? dan jawabannya adalah bisa. Laravel bisa membuat View tanpa menggunakan Blade.
Laravel juga bisa merender file PHP biasa (misalnya resources/views/halo.php). Blade adalah pilihan bawaan dan yang direkomendasikan, bukan keharusan.
Blade adalah template engine bawaan Laravel. Ia memberi sintaks singkat untuk menulis tampilan, seperti {{ }}, @foreach, @if, dan @extends. Filenya berakhiran .blade.php.
Prosesnya begini, pada saat sebuah halaman pertama kali dibuka. Laravel mengubah (compile) file Blade menjadi PHP biasa dan menyimpannya di storage/framework/views.
Request berikutnya langsung memakai hasil compile itu. Jadi yang dijalankan server tetap PHP murni dan Blade tidak membuat aplikasi lebih lambat. Blade hanya membuat cara menulisnya lebih enak.
Sebagai gambaran, ini Blade:
<h1>Halo, {{ $nama }}</h1>Dan ini kira-kira hasil compile-nya:
<h1>Halo, <?php echo e($nama); ?></h1>Sebagai contoh yang lainnya, berikut perbandingan bentuk syntax tanpa Blade dan pakai Blade:
Ini PHP biasa:
<?php foreach ($produk as $item): ?>
<li><?php echo htmlspecialchars($item); ?></li>
<?php endforeach; ?>dan ini pakai Blade:
@foreach ($produk as $item)
{{ $item }}
@endforeach
Isinya sama, tapi versi Blade jauh lebih mudah dibaca dan ini sangat berpengaruh apabila syntax yang kamu bangun sudah rumit dan panjang.
Bonusnya adanya {{ }} otomatis meng-escape output, jadi tag atau script berbahaya dari input pengguna ditampilkan sebagai teks biasa. Ini melindungi dari serangan XSS.
Terus dengan @extends, @section, dan @yield, kita bisa membuat satu kerangka halaman yang dipakai banyak halaman lain. Di PHP biasa, hal serupa biasanya dikerjakan dengan include atau require manual di setiap file dan itu lebih mudah berantakan.
Kalau kita pakai contoh punya kita diatas maka bentuknya seperti ini apabila pakai Blade:
<h1>Produk Kami</h1>
<ul>
@foreach ($produk as $item)
<li>{{ $item }}</li>
@endforeach
</ul>Blade mengulang bagian <li> untuk setiap item di $produk, jadi di browser muncul Kopi, Teh, Cokelat, dan Susu sebagai daftar.
Setiap perintah yang dibuka dengan @foreach harus ditutup dengan @endforeach. Pola yang sama berlaku untuk yang lain: @if ditutup @endif, @for ditutup @endfor.
Bahkan untuk penerapan percabangan, maka kita bisa membuatnya seperti ini:
@if (count($produk) > 0)
<p>Ada {{ count($produk) }} produk tersedia.</p>
@else
<p>Maaf, produk sedang kosong.</p>
@endifLogikanya sama dengan if di PHP biasa, tapi penulisannya bisa lebih ringkas dan penulisan yang ringkas akan mempermudahkan kita dalam tracking nantinya.
Setting Layout
Hampir semua halaman di sebuah website punya bagian yang sama: menu di atas, footer di bawah, dan pengaturan di <head>. Menyalin HTML yang sama ke setiap file jelas sangat tidak efisien.
Soalnya dengan begitu maka kalau mau mengganti menu, semua file harus diedit satu per satu. Solusinya adalah satu layout induk dan halaman lain tinggal pakai saja. Buat file resources/views/layouts/app.blade.php:
<!DOCTYPE html>
<html>
<head>
<title>@yield('judul')</title>
</head>
<body>
<nav>
<a href="/">Beranda</a>
<a href="/produk">Produk</a>
</nav>
<div class="konten">
@yield('konten')
</div>
<footer>
<p>© 2026 Toko Saya</p>
</footer>
</body>
</html>@yield(‘judul’) dan @yield(‘konten’) adalah “lubang kosong” yang nanti diisi oleh halaman lain. Sekarang ubah resources/views/produk/index.blade.php supaya memakai layout tadi:
@extends('layouts.app')
@section('judul', 'Daftar Produk')
@section('konten')
<h1>Produk Kami</h1>
<ul>
@foreach ($produk as $item)
<li>{{ $item }}</li>
@endforeach
</ul>
@endsection- @extends(‘layouts.app’) berarti halaman ini memakai kerangka dari layouts/app.blade.php.
- @section(‘judul’, ‘Daftar Produk’) mengisi lubang judul.
- @section(‘konten’) sampai @endsection mengisi lubang konten utama.
Sekarang halaman produk otomatis punya menu dan footer tanpa menulis ulang. Mau mengubah menu? Cukup edit sekali di layouts/app.blade.php dan semua halaman ikut berubah.
Ini lah yang menjadi salah satu keunggulan menggunakan Blade. Semua jadi mudah apabila ada perubahan pada View.
Penutup: Keseluruhan Hubungan
Kita dadri awal sudah membahas konsep dari Route, Controller dan View. Terus kita juga membahas bagaimana kita membangun dan cara komunikasi setiap fungsi-fungsi tersebut.
Kamu pasti masih sedikit bingung, biar kamu lebih paham. Mari kita rekap lagi apa yang abang bahas diatas. Pertama kamu bangun dulu Controllernya. Contoh Controller adalah ProdukController.php
class ProdukController extends Controller
{
public function index()
{
$produk = ['Kopi', 'Teh', 'Cokelat', 'Susu'];
return view('produk.index', ['produk' => $produk]);
}
public function detail($id)
{
$daftar = ['Kopi', 'Teh', 'Cokelat', 'Susu'];
// ambil produk sesuai urutan, kalau tidak ada hasilnya null
$nama = $daftar[$id] ?? null;
return view('produk.detail', ['nama' => $nama, 'id' => $id]);
}
}Kedua, kita buat komunikasinya Route di routes/web.php:
use App\Http\Controllers\ProdukController;
Route::get('/produk', [ProdukController::class, 'index']);
Route::get('/produk/{id}', [ProdukController::class, 'detail']);Ketiga, kamu bangun tampilan Viewnya di resources/views/produk/detail.blade.php:
@extends('layouts.app')
@section('judul', 'Detail Produk')
@section('konten')
@if ($nama)
<h1>{{ $nama }}</h1>
<p>Kamu sedang melihat produk nomor {{ $id }}.</p>
@else
<h1>Produk tidak ditemukan</h1>
<p>Maaf, produk yang kamu cari tidak ada.</p>
@endif
@endsectionSekarang coba buka beberapa alamat ini:
- /produk/0 menampilkan “Kopi”
- /produk/2 menampilkan “Cokelat”
- /produk/99 menampilkan “Produk tidak ditemukan”
Ketiganya bekerja bareng, antara Route menangkap request. Selanjutnya Controller menyiapkan data dan view menampilkannya lewat Blade. Pola ini akan terus kamu pakai di Laravel.
Hampir pasti kamu akan ketemu error View [produk.index] not found. Penyebabnya biasanya nama file atau foldernya salah, lupa akhiran .blade.php, atau file disimpan di luar resources/views.
Error lain yang sering muncul adalah lupa menutup @foreach dengan @endforeach. Periksa hal-hal itu dulu sebelum curiga ke yang lain.
Controller dan View adalah pasangan yang tidak bisa dipisah. Controller mengurus data dan logika, View mengurus tampilan, dan Blade membuat penulisan tampilan jadi jauh lebih ringan.
Jangan cuma dibaca. Buka project-mu, ketik ulang contohnya, ganti isi daftar produknya, lalu lihat apa yang berubah. Kalau muncul error maka itu wajar dan justru dari situ biasanya kita paham.
So lets make some codes!