<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Belajar Teknologi</title>
	<atom:link href="https://ramzilhuda.com/tag/laravel-12/feed/" rel="self" type="application/rss+xml" />
	<link>https://ramzilhuda.com</link>
	<description>Belajar dan Sharing Ilmu Teknologi</description>
	<lastBuildDate>Mon, 19 Oct 2026 01:50:07 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.4</generator>

<image>
	<url>https://i0.wp.com/ramzilhuda.com/wp-content/uploads/2019/09/cropped-thunder.png?fit=32%2C32&#038;ssl=1</url>
	<title>Belajar Teknologi</title>
	<link>https://ramzilhuda.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">166916531</site>	<item>
		<title>Tutorial Laravel 12: Membuat Fitur Login dan Register dengan Breeze</title>
		<link>https://ramzilhuda.com/tutorial-laravel-12-login-register-breeze/</link>
					<comments>https://ramzilhuda.com/tutorial-laravel-12-login-register-breeze/#respond</comments>
		
		<dc:creator><![CDATA[ramzilhuda]]></dc:creator>
		<pubDate>Wed, 28 Oct 2026 02:00:35 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[laravel 12]]></category>
		<category><![CDATA[laravel breeze]]></category>
		<category><![CDATA[login laravel]]></category>
		<category><![CDATA[middleware auth]]></category>
		<category><![CDATA[register laravel]]></category>
		<guid isPermaLink="false">https://ramzilhuda.com/?p=1351</guid>

					<description><![CDATA[Hampir setiap aplikasi web butuh fitur login dan register, tetapi menulis sistem autentikasi dari nol itu melelahkan dan rawan celah keamanan. Tutorial Laravel Breeze login register ini menunjukkan cara mendapatkan fitur autentikasi lengkap (register, login, logout, lupa password, verifikasi email) hanya dengan beberapa perintah, memakai starter kit resmi bernama Laravel Breeze. Panduan ini adalah lanjutan [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Hampir setiap <a href="https://ramzilhuda.com/bagaimana-cara-melihata-whatasapp-kita-di-intai-orang-lain/">aplikasi</a> web butuh fitur login dan register, tetapi menulis sistem autentikasi dari nol itu melelahkan dan rawan celah keamanan. Tutorial <a href="https://ramzilhuda.com/cara-membuat-project-sederhana-menggunakan-laravel-part-1/">Laravel</a> Breeze login register ini menunjukkan cara mendapatkan fitur autentikasi lengkap (register, login, logout, lupa password, verifikasi email) hanya dengan beberapa perintah, memakai starter kit resmi bernama Laravel Breeze.</p>
<p>Panduan ini adalah lanjutan alami dari seri Laravel di blog ini. Kita memakai Laravel 12 dengan PHP 8.2, dan di akhir kamu akan memahami cara kerja autentikasi bawaan Laravel, cara mengubah tampilannya, serta cara melindungi halaman agar hanya bisa diakses pengguna yang sudah login.</p>
<p><img data-recalc-dims="1" decoding="async" src="https://i0.wp.com/ramzilhuda.com/wp-content/uploads/2026/10/batch3-06-isi.webp?ssl=1" alt="alur autentikasi laravel breeze" /></p>
<h2>Apa Itu Laravel Breeze?</h2>
<p>Laravel Breeze adalah starter kit autentikasi resmi dari tim Laravel yang menyediakan semua hal dasar: halaman login, register, lupa password, reset password, verifikasi email, halaman profil, dan route dashboard. Breeze tersedia dalam beberapa varian tampilan (Blade, Livewire, React, Vue, dan API), dan dalam tutorial ini kita memakai varian Blade karena paling cocok untuk pemula yang sudah familiar dengan HTML.</p>
<p>Penting untuk dipahami: Breeze bukan package ajaib yang menyembunyikan kode. Semua controller, view, dan route-nya dipublikasikan ke projectmu sehingga kamu bisa membaca, mempelajari, dan mengubahnya sesuka hati. Inilah yang membuatnya ideal untuk belajar, berbeda dengan solusi autentikasi yang kodenya tertutup.</p>
<p>Prasyarat sebelum mulai: PHP 8.2 atau lebih baru, Composer, Node.js dengan npm, dan MySQL yang sudah berjalan. Kalau MySQL-mu belum siap, ikuti dulu panduan <a href="https://ramzilhuda.com/belajar-mysql-untuk-pemula/">Belajar MySQL untuk Pemula</a> yang sudah terjadwal di blog ini.</p>
<h2>Tutorial Laravel Breeze Login Register: Instalasi</h2>
<p>Langkah pertama adalah membuat project Laravel 12 baru, lalu menambahkan Breeze sebagai dependensi development:</p>
<pre><code class="language-bash">composer create-project laravel/laravel:^12.0 auth-breeze
cd auth-breeze
composer require laravel/breeze --dev
</code></pre>
<p>Perintah pertama mengunduh kerangka Laravel 12 ke folder <code>auth-breeze</code>. Perintah kedua menambahkan package Breeze khusus untuk lingkungan development. Selanjutnya, jalankan installer Breeze dan pilih varian Blade saat ditanya:</p>
<pre><code class="language-bash">php artisan breeze:install
</code></pre>
<p>Installer akan menanyakan stack yang diinginkan. Pilih <code>blade</code> untuk tutorial ini. Breeze kemudian mempublikasikan controller autentikasi ke <code>app/Http/Controllers/Auth</code>, view ke <code>resources/views/auth</code>, dan route ke <code>routes/auth.php</code>. Ia juga menambahkan route dashboard contoh ke <code>routes/web.php</code>.</p>
<p>Setelah instalasi, jalankan migrasi database untuk membuat tabel <code>users</code> dan tabel pendukungnya:</p>
<pre><code class="language-bash">php artisan migrate
</code></pre>
<p>Pastikan konfigurasi database di file <code>.env</code> sudah benar (nama database, username, dan password MySQL). Jika migrasi gagal, 90 persen penyebabnya adalah kredensial database yang salah di <code>.env</code>.</p>
<p>Terakhir, install dependensi frontend dan jalankan server development:</p>
<pre><code class="language-bash">npm install
npm run dev
</code></pre>
<p>Jalankan juga <code>php artisan serve</code> di terminal terpisah, lalu buka <code>http://localhost:8000</code>. Kamu akan melihat halaman welcome Laravel dengan tautan Login dan Register di pojok kanan atas. Klik Register, isi formulir, dan akun pertamamu langsung jadi.</p>
<h2>Memahami File-File Penting Breeze</h2>
<p>Agar tidak sekadar &#8220;bisa pakai&#8221;, mari pahami struktur yang dibuat Breeze. Route autentikasi didaftarkan di <code>routes/auth.php</code> yang di-include dari <code>routes/web.php</code>:</p>
<pre><code class="language-php">require __DIR__.'/auth.php';
</code></pre>
<p>Controller seperti <code>RegisteredUserController</code> dan <code>AuthenticatedSessionController</code> di folder <code>app/Http/Controllers/Auth</code> menangani <a href="https://ramzilhuda.com/logika-proposisi-matematika-diskrit/">logika</a> register dan login. View-nya ada di <code>resources/views/auth/</code>, misalnya <code>login.blade.php</code> dan <code>register.blade.php</code>, memakai class Tailwind CSS untuk tampilannya.</p>
<p><a href="https://ramzilhuda.com/tujuan-mengevaluasi-model-artificial-neural-network-dengan-cross-validation/">Model</a> <code>App\Models\User</code> sudah disiapkan dengan trait <code>HasFactory</code> dan <code>Notifiable</code>, serta kolom <code>name</code>, <code>email</code>, dan <code>password</code> yang otomatis di-hash dengan bcrypt saat register. Kamu tidak perlu menulis logika hashing password sendiri.</p>
<h2>Tutorial Laravel Breeze Login Register: Kustomisasi Tampilan</h2>
<p>Tampilan bawaan Breeze memang fungsional, tetapi kamu pasti ingin menyesuaikannya dengan identitas aplikasimu. Karena semua view dipublikasikan ke project, kustomisasi semudah mengedit file Blade biasa.</p>
<p>Misalnya, untuk mengubah judul dan teks di halaman login, buka <code>resources/views/auth/login.blade.php</code> dan ubah bagian headingnya. Kamu juga bisa mengganti logo bawaan dengan logomu sendiri di file <a href="https://ramzilhuda.com/cara-menggunakan-coordinator-layout-di-android-studio-pertama-kali/">layout</a> <code>resources/views/layouts/guest.blade.php</code> yang dipakai semua halaman autentikasi.</p>
<p>Untuk mengubah nama aplikasi yang tampil di email verifikasi dan notifikasi, cukup ubah di file <code>.env</code>:</p>
<pre><code>APP_NAME="Aplikasi Kampusku"
</code></pre>
<p>Setelah mengubah view atau asset, pastikan Vite dev server (<code>npm run dev</code>) sedang berjalan agar perubahan Tailwind langsung terlihat. Untuk production, jalankan <code>npm run build</code> agar asset dikompilasi menjadi file statis yang optimal.</p>
<h2>Proteksi Route dengan Middleware Auth</h2>
<p>Fitur login tidak ada gunanya jika halaman penting tetap bisa dibuka tanpa login. Di Laravel, proteksi dilakukan dengan middleware <code>auth</code>. Breeze sudah mencontohkannya pada route dashboard di <code>routes/web.php</code>:</p>
<pre><code class="language-php">use App\Http\Controllers\ProfileController;
use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return view('welcome');
});

Route::get('/dashboard', function () {
    return view('dashboard');
})-&gt;middleware(['auth', 'verified'])-&gt;name('dashboard');

Route::middleware('auth')-&gt;group(function () {
    Route::get('/profile', [ProfileController::class, 'edit'])-&gt;name('profile.edit');
    Route::patch('/profile', [ProfileController::class, 'update'])-&gt;name('profile.update');
    Route::delete('/profile', [ProfileController::class, 'destroy'])-&gt;name('profile.destroy');
});

require __DIR__.'/auth.php';
</code></pre>
<p>Pola yang perlu kamu tiru adalah <code>Route::middleware('auth')-&gt;group(...)</code>: semua route di dalam grup ini otomatis menolak pengunjung yang belum login dan mengarahkannya ke halaman login. Middleware <code>verified</code> menambahkan syarat bahwa email pengguna harus sudah diverifikasi.</p>
<p>Untuk halaman admin atau dosen nantinya, kamu bisa membuat middleware sendiri, misalnya <code>is_admin</code>, dan menerapkannya dengan pola yang sama. Prinsipnya selalu sama: daftarkan middleware, lalu tempelkan ke route atau grup route yang perlu dilindungi.</p>
<h2>Menguji Alur Login dan Register</h2>
<p>Setelah semua terpasang, uji alur lengkapnya seperti pengguna sungguhan. Daftarkan akun baru lewat halaman register, verifikasi bahwa kamu langsung diarahkan ke dashboard, lalu logout dan login kembali dengan akun yang sama. Coba juga fitur &#8220;lupa password&#8221; untuk memastikan email reset terkirim (untuk development, atur <code>MAIL_MAILER=log</code> di <code>.env</code> agar isi email tercatat di file log, bukan benar-benar terkirim).</p>
<p>Uji juga sisi keamanannya: buka URL <code>/dashboard</code> di jendela incognito tanpa login. Kamu harus diarahkan ke halaman login. Jika halaman dashboard tetap terbuka, berarti middleware belum terpasang dengan benar.</p>
<h2>Menambah Field Kustom pada Form Register</h2>
<p>Form register bawaan Breeze hanya meminta nama, email, dan password. Untuk aplikasi nyata, kamu sering butuh field tambahan, misalnya nomor HP atau NIM. Caranya terdiri dari tiga langkah: tambah kolom di database, tampilkan di form, dan simpan lewat controller.</p>
<p>Pertama, buat migrasi untuk menambah kolom:</p>
<pre><code class="language-bash">php artisan make:migration add_no_hp_to_users_table
</code></pre>
<p>Lalu edit file migrasi yang dihasilkan:</p>
<pre><code class="language-php">public function up(): void
{
    Schema::table('users', function (Blueprint $table) {
        $table-&gt;string('no_hp', 15)-&gt;nullable()-&gt;after('email');
    });
}
</code></pre>
<p>Jalankan <code>php artisan migrate</code> untuk menerapkan perubahan. Kedua, tambahkan input di <code>resources/views/auth/register.blade.php</code> mengikuti pola input yang sudah ada. Ketiga, buka <code>app/Http/Controllers/Auth/RegisteredUserController.php</code> dan tambahkan validasi serta penyimpanan field barunya:</p>
<pre><code class="language-php">$request-&gt;validate([
    'name' =&gt; ['required', 'string', 'max:255'],
    'email' =&gt; ['required', 'string', 'email', 'max:255', 'unique:'.User::class],
    'no_hp' =&gt; ['nullable', 'string', 'max:15'],
    'password' =&gt; ['required', 'confirmed', Rules\Password::defaults()],
]);

$user = User::create([
    'name' =&gt; $request-&gt;name,
    'email' =&gt; $request-&gt;email,
    'no_hp' =&gt; $request-&gt;no_hp,
    'password' =&gt; Hash::make($request-&gt;password),
]);
</code></pre>
<p>Pola ini berlaku untuk field tambahan apa pun. Kuncinya selalu tiga langkah yang sama: migrasi, view, dan controller. Setelah memahami polanya, kamu bisa menambahkan field sebanyak yang dibutuhkan aplikasimu.</p>
<h2>Membuat Halaman Terproteksi Sendiri</h2>
<p>Sekarang praktikkan middleware auth pada halaman buatanmu sendiri, misalnya halaman &#8220;Nilai Saya&#8221; untuk mahasiswa. Buat controller dan view-nya:</p>
<pre><code class="language-bash">php artisan make:controller NilaiController
</code></pre>
<p>Isi controller dengan method sederhana:</p>
<pre><code class="language-php">namespace App\Http\Controllers;

class NilaiController extends Controller
{
    public function index()
    {
        $nilai = [
            ['mk' =&gt; 'Pemrograman Dasar', 'nilai' =&gt; 'A'],
            ['mk' =&gt; 'Basis Data', 'nilai' =&gt; 'AB'],
        ];
        return view('nilai.index', compact('nilai'));
    }
}
</code></pre>
<p>Lalu daftarkan route-nya di dalam grup middleware auth di <code>routes/web.php</code>:</p>
<pre><code class="language-php">Route::middleware('auth')-&gt;group(function () {
    Route::get('/nilai-saya', [NilaiController::class, 'index'])-&gt;name('nilai.index');
    // ... route profile bawaan Breeze tetap di sini
});
</code></pre>
<p>Buat file view <code>resources/views/nilai/index.blade.php</code> yang extends layout Breeze, dan halaman itu kini hanya bisa diakses setelah login. Coba akses <code>/nilai-saya</code> tanpa login untuk membuktikan proteksinya bekerja. Pola inilah fondasi dari semua fitur berbasis peran: halaman admin, dashboard dosen, dan area member semuanya memakai teknik yang sama.</p>
<h2>Troubleshooting Instalasi Breeze</h2>
<p>Tiga masalah paling sering dialami pemula saat mengikuti tutorial ini. Pertama, <code>composer require laravel/breeze --dev</code> gagal karena versi PHP di bawah 8.2. Laravel 12 mensyaratkan PHP 8.2 atau lebih baru, jadi periksa dengan <code>php -v</code> dan upgrade dulu jika perlu.</p>
<p>Kedua, <code>php artisan migrate</code> error dengan pesan access denied. Ini hampir selalu berarti kredensial database di file <code>.env</code> salah, atau database-nya belum dibuat. Buat dulu database kosongnya (misalnya via phpMyAdmin), lalu sesuaikan <code>DB_DATABASE</code>, <code>DB_USERNAME</code>, dan <code>DB_PASSWORD</code>.</p>
<p>Ketiga, halaman tampil tanpa styling Tailwind (terlihat polos). Penyebabnya adalah Vite dev server belum berjalan. Pastikan <code>npm run dev</code> aktif di terminal terpisah saat development, atau jalankan <code>npm run build</code> agar asset dikompilasi menjadi file statis yang optimal. Jika port 5173 bentrok, tutup proses yang memakai port tersebut lalu jalankan ulang.</p>
<p>Satu tips tambahan: jika kamu mengerjakan tutorial ini di komputer laboratorium kampus yang tidak mengizinkan instalasi Node.js sama sekali, kamu tetap bisa mengikuti bagian <a href="https://ramzilhuda.com/mengenal-server-peran-dan-tipe-server-yang-perlu-diketahui/">backend</a> (instalasi Breeze, migrasi, middleware) karena hanya membutuhkan PHP dan Composer. Bagian tampilan memang butuh npm, tetapi logika autentikasinya tetap bisa dipelajari dan diuji tanpa itu.</p>
<h2>Kesimpulan</h2>
<p>Kamu sudah menyelesaikan tutorial Laravel Breeze login register ini: menginstal Breeze via Composer, menjalankan migrasi database, memahami struktur controller dan view yang dihasilkan, mengkustomisasi tampilan Blade, dan memproteksi route dengan middleware <code>auth</code>. Dengan fondasi ini, aplikasi apapun yang kamu bangun sudah punya sistem autentikasi yang aman mengikuti standar Laravel.</p>
<p>Seri Laravel di blog ini kini mencakup CRUD, REST API, dan autentikasi. Langkah berikutnya yang alami adalah menggabungkan ketiganya dalam satu project utuh. Mulai dari <a href="https://ramzilhuda.com/tutorial-laravel-12-crud-pemula/">Tutorial Laravel 12: Membuat CRUD Sederhana dari Nol untuk Pemula</a> jika kamu belum mengikutinya, lalu lanjutkan ke <a href="https://ramzilhuda.com/cara-membuat-rest-api-laravel/">Cara Membuat REST API dengan Laravel</a> untuk mengekspos datamu sebagai API. Dengan Git untuk version control, MySQL untuk database, dan Breeze untuk autentikasi, kamu sudah punya bekal lengkap membangun aplikasi web modern.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramzilhuda.com/tutorial-laravel-12-login-register-breeze/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1351</post-id>	</item>
		<item>
		<title>Tutorial Laravel 12: Membuat CRUD Sederhana dari Nol untuk Pemula</title>
		<link>https://ramzilhuda.com/tutorial-laravel-12-crud-pemula/</link>
					<comments>https://ramzilhuda.com/tutorial-laravel-12-crud-pemula/#respond</comments>
		
		<dc:creator><![CDATA[ramzilhuda]]></dc:creator>
		<pubDate>Sat, 10 Oct 2026 08:01:08 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[belajar laravel]]></category>
		<category><![CDATA[crud laravel]]></category>
		<category><![CDATA[laravel 12]]></category>
		<category><![CDATA[php framework]]></category>
		<category><![CDATA[tutorial laravel]]></category>
		<guid isPermaLink="false">https://ramzilhuda.com/?p=1290</guid>

					<description><![CDATA[Belajar Laravel paling cepat bukan dengan menghafal dokumentasi, melainkan dengan membangun sesuatu yang nyata. Dan proyek paling klasik untuk pemula adalah CRUD, singkatan dari Create, Read, Update, Delete, empat operasi dasar dalam mengelola data. Dalam tutorial Laravel 12 ini, kamu akan membangun aplikasi pendataan produk sederhana dari nol: tambah data, tampilkan daftar, ubah data, dan [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Belajar <a href="https://ramzilhuda.com/cara-membuat-project-sederhana-menggunakan-laravel-part-1/">Laravel</a> paling cepat bukan dengan menghafal dokumentasi, melainkan dengan membangun sesuatu yang nyata. Dan proyek paling klasik untuk pemula adalah <strong>CRUD</strong>, singkatan dari Create, Read, Update, Delete, empat operasi dasar dalam mengelola data.</p>
<p>Dalam tutorial Laravel 12 ini, kamu akan membangun <a href="https://ramzilhuda.com/bagaimana-cara-melihata-whatasapp-kita-di-intai-orang-lain/">aplikasi</a> pendataan produk sederhana dari nol: tambah data, tampilkan daftar, ubah data, dan hapus data. Semua langkah dijelaskan berurutan lengkap dengan contoh kode yang bisa langsung kamu praktikkan. Di akhir tutorial, kamu akan memahami alur kerja utama Laravel yaitu route, controller, <a href="https://ramzilhuda.com/tujuan-mengevaluasi-model-artificial-neural-network-dengan-cross-validation/">model</a>, migration, dan Blade. Kalau kamu benar-benar baru di dunia Laravel, baca juga <a href="https://ramzilhuda.com/cara-membuat-project-sederhana-menggunakan-laravel-part-1/">panduan membuat project sederhana menggunakan Laravel</a> untuk pengenalan awal yang lebih santai.</p>
<h2>Apa Itu CRUD dan Kenapa Laravel Cocok untuk Mempelajarinya?</h2>
<p>CRUD adalah fondasi hampir semua aplikasi web. Aplikasi kasir, sistem akademik, toko online, semuanya dibangun di atas empat operasi ini. Laravel sangat cocok untuk belajar CRUD karena menyediakan semua peralatannya secara bawaan: Eloquent ORM untuk database, Blade untuk tampilan, dan resource controller yang memetakan operasi CRUD ke method secara rapi.</p>
<p>Yang akan kita bangun adalah aplikasi <strong>Data Produk</strong> sederhana dengan field nama, deskripsi, harga, dan stok.</p>
<p><img data-recalc-dims="1" decoding="async" alt="Diagram siklus CRUD: Create, Read, Update, Delete" src="https://i0.wp.com/ramzilhuda.com/wp-content/uploads/2026/10/media-generation-laravel-crud-diagram-0-6707a612-99e8-4e40-93b7-6b7972133c9b.jpg?ssl=1" /></p>
<h2>Prasyarat: Yang Perlu Disiapkan</h2>
<p>Sebelum mulai, pastikan komputermu sudah memiliki:</p>
<ol>
<li><strong>PHP 8.2 atau lebih baru</strong> (Laravel 12 membutuhkan minimal PHP 8.2). Cek dengan perintah <code>php -v</code>.</li>
<li><strong>Composer</strong>, package manager PHP. Cek dengan <code>composer --version</code>.</li>
<li><strong>MySQL</strong> atau MariaDB yang sudah berjalan. Kamu juga bisa memakai SQLite untuk latihan cepat.</li>
<li>Teks editor seperti VS Code.</li>
</ol>
<p>Jika semua sudah siap, mari mulai langkah pertama.</p>
<h2>Langkah 1: Instalasi Laravel 12</h2>
<p>Buka terminal, lalu jalankan perintah berikut untuk membuat proyek baru bernama <code>toko-sederhana</code>:</p>
<pre><code class="language-bash">composer create-project laravel/laravel:^12.0 toko-sederhana
cd toko-sederhana
</code></pre>
<p>Tunggu proses instalasi selesai. Setelah itu, jalankan <a href="https://ramzilhuda.com/mengenal-server-peran-dan-tipe-server-yang-perlu-diketahui/">server</a> development bawaan Laravel:</p>
<pre><code class="language-bash">php artisan serve
</code></pre>
<p>Buka browser dan akses <code>http://127.0.0.1:8000</code>. Jika halaman selamat datang Laravel muncul, instalasi berhasil.</p>
<h2>Langkah 2: Konfigurasi Database</h2>
<p>Buka file <code>.env</code> di folder proyek, lalu sesuaikan pengaturan database dengan milikmu:</p>
<pre><code class="language-env">DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=toko_sederhana
DB_USERNAME=root
DB_PASSWORD=
</code></pre>
<p>Buat database kosong bernama <code>toko_sederhana</code> di MySQL terlebih dahulu, misalnya lewat phpMyAdmin atau perintah SQL <code>CREATE DATABASE toko_sederhana;</code>.</p>
<h2>Langkah 3: Membuat Model, Migration, dan Controller Sekaligus</h2>
<p>Salah satu keunggulan Laravel adalah perintah artisan yang bisa menghasilkan beberapa file sekaligus. Untuk fitur produk, kita butuh model <code>Product</code>, file migration untuk tabelnya, dan controller. Cukup satu perintah:</p>
<pre><code class="language-bash">php artisan make:model Product -mcr
</code></pre>
<p>Arti flag-nya: <code>-m</code> membuat migration, <code>-c</code> membuat controller, <code>-r</code> membuat controller bertipe resource (sudah berisi method CRUD standar). Perintah ini menghasilkan tiga file:</p>
<ul>
<li><code>app/Models/Product.php</code></li>
<li><code>database/migrations/xxxx_xx_xx_xxxxxx_create_products_table.php</code></li>
<li><code>app/Http/Controllers/ProductController.php</code></li>
</ul>
<h2>Langkah 4: Menulis Migration untuk Tabel Products</h2>
<p>Buka file migration yang baru dibuat, lalu definisikan struktur tabel di dalam method <code>up</code>:</p>
<pre><code class="language-php">public function up(): void
{
    Schema::create('products', function (Blueprint $table) {
        $table-&gt;id();
        $table-&gt;string('name');
        $table-&gt;text('description')-&gt;nullable();
        $table-&gt;decimal('price', 12, 2);
        $table-&gt;integer('stock')-&gt;default(0);
        $table-&gt;timestamps();
    });
}
</code></pre>
<p>Setelah itu jalankan migration untuk membuat tabelnya di database:</p>
<pre><code class="language-bash">php artisan migrate
</code></pre>
<p>Jika berhasil, tabel <code>products</code> beserta kolomnya sudah tersedia.</p>
<h2>Langkah 5: Mengatur Model Product</h2>
<p>Buka <code>app/Models/Product.php</code> dan tambahkan properti <code>$fillable</code>. Properti ini menentukan kolom mana saja yang boleh diisi secara massal, sekaligus melindungi dari celah mass assignment:</p>
<pre><code class="language-php">&lt;?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    protected $fillable = ['name', 'description', 'price', 'stock'];
}
</code></pre>
<h2>Langkah 6: Menulis Logika CRUD di Controller</h2>
<p>Inilah bagian inti tutorial. Buka <code>app/Http/Controllers/ProductController.php</code> dan isi ketujuh method resource sebagai berikut:</p>
<pre><code class="language-php">&lt;?php

namespace App\Http\Controllers;

use App\Models\Product;
use Illuminate\Http\Request;

class ProductController extends Controller
{
    // READ: tampilkan semua produk
    public function index()
    {
        $products = Product::latest()-&gt;paginate(10);
        return view('products.index', compact('products'));
    }

    // CREATE: tampilkan form tambah
    public function create()
    {
        return view('products.create');
    }

    // CREATE: simpan data baru
    public function store(Request $request)
    {
        $validated = $request-&gt;validate([
            'name'        =&gt; 'required|string|max:255',
            'description' =&gt; 'nullable|string',
            'price'       =&gt; 'required|numeric|min:0',
            'stock'       =&gt; 'required|integer|min:0',
        ]);

        Product::create($validated);

        return redirect()-&gt;route('products.index')
            -&gt;with('success', 'Produk berhasil ditambahkan.');
    }

    // READ: tampilkan satu produk
    public function show(Product $product)
    {
        return view('products.show', compact('product'));
    }

    // UPDATE: tampilkan form edit
    public function edit(Product $product)
    {
        return view('products.edit', compact('product'));
    }

    // UPDATE: simpan perubahan
    public function update(Request $request, Product $product)
    {
        $validated = $request-&gt;validate([
            'name'        =&gt; 'required|string|max:255',
            'description' =&gt; 'nullable|string',
            'price'       =&gt; 'required|numeric|min:0',
            'stock'       =&gt; 'required|integer|min:0',
        ]);

        $product-&gt;update($validated);

        return redirect()-&gt;route('products.index')
            -&gt;with('success', 'Produk berhasil diperbarui.');
    }

    // DELETE: hapus produk
    public function destroy(Product $product)
    {
        $product-&gt;delete();

        return redirect()-&gt;route('products.index')
            -&gt;with('success', 'Produk berhasil dihapus.');
    }
}
</code></pre>
<p>Perhatikan dua hal penting di kode ini. Pertama, <code>$request-&gt;validate()</code> memastikan data yang masuk sudah benar sebelum disimpan. Kedua, Laravel otomatis mengubah parameter <code>Product $product</code> menjadi data produk yang sesuai berdasarkan ID di URL. Fitur ini namanya route model binding.</p>
<h2>Langkah 7: Mendaftarkan Route</h2>
<p>Buka <code>routes/web.php</code> dan daftarkan satu baris route resource. Satu baris ini otomatis membuat semua URL dan nama route untuk ketujuh method di atas:</p>
<pre><code class="language-php">use App\Http\Controllers\ProductController;

Route::resource('products', ProductController::class);
</code></pre>
<p>Dengan ini kamu mendapatkan URL seperti <code>/products</code> (daftar), <code>/products/create</code> (form tambah), <code>/products/{id}/edit</code> (form ubah), dan seterusnya.</p>
<h2>Langkah 8: Membuat Tampilan dengan Blade</h2>
<p>Buat folder <code>resources/views/products</code>, lalu buat file-file berikut.</p>
<p><strong><a href="https://ramzilhuda.com/cara-menggunakan-coordinator-layout-di-android-studio-pertama-kali/">Layout</a> dasar</strong> (<code>resources/views/layouts/app.blade.php</code>):</p>
<pre><code class="language-blade">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;id&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;Data Produk&lt;/title&gt;
    &lt;style&gt;
        body { font-family: sans-serif; max-width: 900px; margin: 2rem auto; padding: 0 1rem; }
        table { width: 100%; border-collapse: collapse; margin-top: 1rem; }
        th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
        th { background: #f4f4f4; }
        .alert { background: #d4edda; padding: 10px; border-radius: 4px; margin-bottom: 1rem; }
        .btn { display: inline-block; padding: 6px 12px; border-radius: 4px; text-decoration: none; }
        .btn-primary { background: #0d6efd; color: #fff; }
        .btn-warning { background: #ffc107; color: #000; }
        .btn-danger { background: #dc3545; color: #fff; border: none; cursor: pointer; }
        form div { margin-bottom: 12px; }
        label { display: block; margin-bottom: 4px; font-weight: bold; }
        input, textarea { width: 100%; padding: 8px; border: 1px solid #ccc; border-radius: 4px; }
        .error { color: #dc3545; font-size: 0.9em; }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h1&gt;Aplikasi Data Produk&lt;/h1&gt;

    @if (session('success'))
        &lt;div class=&quot;alert&quot;&gt;{{ session('success') }}&lt;/div&gt;
    @endif

    @yield('content')
&lt;/body&gt;
&lt;/html&gt;
</code></pre>
<p><strong>Daftar produk</strong> (<code>resources/views/products/index.blade.php</code>):</p>
<pre><code class="language-blade">@extends('layouts.app')

@section('content')
    &lt;a href=&quot;{{ route('products.create') }}&quot; class=&quot;btn btn-primary&quot;&gt;Tambah Produk&lt;/a&gt;

    &lt;table&gt;
        &lt;thead&gt;
            &lt;tr&gt;
                &lt;th&gt;Nama&lt;/th&gt;
                &lt;th&gt;Harga&lt;/th&gt;
                &lt;th&gt;Stok&lt;/th&gt;
                &lt;th&gt;Aksi&lt;/th&gt;
            &lt;/tr&gt;
        &lt;/thead&gt;
        &lt;tbody&gt;
            @forelse ($products <a href="https://ramzilhuda.com/meta-didenda-13-miliar-atas-transfer-data-ke-as/">as</a> $product)
                &lt;tr&gt;
                    &lt;td&gt;{{ $product-&gt;name }}&lt;/td&gt;
                    &lt;td&gt;Rp {{ number_format($product-&gt;price, 0, ',', '.') }}&lt;/td&gt;
                    &lt;td&gt;{{ $product-&gt;stock }}&lt;/td&gt;
                    &lt;td&gt;
                        &lt;a href=&quot;{{ route('products.edit', $product) }}&quot; class=&quot;btn btn-warning&quot;&gt;Ubah&lt;/a&gt;
                        &lt;form action=&quot;{{ route('products.destroy', $product) }}&quot; method=&quot;POST&quot; style=&quot;display:inline&quot;&gt;
                            @csrf
                            @method('DELETE')
                            &lt;button type=&quot;submit&quot; class=&quot;btn btn-danger&quot;
                                onclick=&quot;return confirm('Hapus produk ini?')&quot;&gt;Hapus&lt;/button&gt;
                        &lt;/form&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
            @empty
                &lt;tr&gt;&lt;td colspan=&quot;4&quot;&gt;Belum ada data produk.&lt;/td&gt;&lt;/tr&gt;
            @endforelse
        &lt;/tbody&gt;
    &lt;/table&gt;

    {{ $products-&gt;links() }}
@endsection
</code></pre>
<p><strong>Form tambah</strong> (<code>resources/views/products/create.blade.php</code>):</p>
<pre><code class="language-blade">@extends('layouts.app')

@section('content')
    &lt;h2&gt;Tambah Produk Baru&lt;/h2&gt;

    &lt;form action=&quot;{{ route('products.store') }}&quot; method=&quot;POST&quot;&gt;
        @csrf
        &lt;div&gt;
            &lt;label&gt;Nama Produk&lt;/label&gt;
            &lt;input type=&quot;text&quot; name=&quot;name&quot; value=&quot;{{ old('name') }}&quot;&gt;
            @error('name') &lt;div class=&quot;error&quot;&gt;{{ $message }}&lt;/div&gt; @enderror
        &lt;/div&gt;
        &lt;div&gt;
            &lt;label&gt;Deskripsi&lt;/label&gt;
            &lt;textarea name=&quot;description&quot;&gt;{{ old('description') }}&lt;/textarea&gt;
        &lt;/div&gt;
        &lt;div&gt;
            &lt;label&gt;Harga&lt;/label&gt;
            &lt;input type=&quot;number&quot; name=&quot;price&quot; value=&quot;{{ old('price') }}&quot;&gt;
            @error('price') &lt;div class=&quot;error&quot;&gt;{{ $message }}&lt;/div&gt; @enderror
        &lt;/div&gt;
        &lt;div&gt;
            &lt;label&gt;Stok&lt;/label&gt;
            &lt;input type=&quot;number&quot; name=&quot;stock&quot; value=&quot;{{ old('stock', 0) }}&quot;&gt;
            @error('stock') &lt;div class=&quot;error&quot;&gt;{{ $message }}&lt;/div&gt; @enderror
        &lt;/div&gt;
        &lt;button type=&quot;submit&quot; class=&quot;btn btn-primary&quot;&gt;Simpan&lt;/button&gt;
    &lt;/form&gt;
@endsection
</code></pre>
<p><strong>Form ubah</strong> (<code>resources/views/products/edit.blade.php</code>): salin file <code>create.blade.php</code>, lalu ubah dua hal: action form menjadi <code>route('products.update', $product)</code> dan tambahkan <code>@method('PUT')</code> tepat di bawah <code>@csrf</code>. Isi value setiap input dengan data lama, contohnya <code>value="{{ old('name', $product-&gt;name) }}"</code>.</p>
<p>Tiga hal penting pada form Blade: <code>@csrf</code> wajib ada untuk keamanan, <code>@method('PUT')</code> dan <code>@method('DELETE')</code> diperlukan karena browser hanya mendukung GET dan POST, dan <code>@error</code> menampilkan pesan validasi dari controller.</p>
<h2>Langkah 9: Uji Aplikasi</h2>
<p>Pastikan server masih berjalan (<code>php artisan serve</code>), lalu buka <code>http://127.0.0.1:8000/products</code>. Coba alurnya satu per satu: tambah produk baru, lihat daftarnya, ubah datanya, lalu hapus. Jika pesan sukses muncul dan data berubah sesuai harapan, selamat, CRUD Laravel 12 pertamamu sudah jadi.</p>
<h2>Memahami Alur Kerja: Dari URL Sampai ke Browser</h2>
<p>Agar tidak sekadar menyalin kode, pahami alur yang terjadi setiap kali kamu membuka halaman. Misalnya saat mengakses <code>/products</code>:</p>
<ol>
<li><strong>Route</strong> menerima permintaan dan meneruskannya ke method <code>index</code> di <code>ProductController</code>.</li>
<li><strong>Controller</strong> meminta data ke <strong>model</strong> <code>Product</code>, yang mengambilnya dari tabel <code>products</code> lewat Eloquent.</li>
<li>Controller mengirim data tersebut ke <strong>view</strong> <code>products.index</code>.</li>
<li><strong>Blade</strong> menggabungkan view dengan layout, lalu hasilnya dikirim kembali ke browser sebagai HTML.</li>
</ol>
<p>Alur yang sama berlaku untuk semua operasi. Form tambah mengirim POST ke method <code>store</code>, form ubah mengirim PUT ke method <code>update</code>, dan tombol hapus mengirim DELETE ke method <code>destroy</code>. Kalau kamu hafal alur empat tahap ini, debugging aplikasi Laravel akan jauh lebih mudah karena kamu selalu tahu di lapisan mana masalah terjadi.</p>
<h2>Kesalahan Umum Pemula dan Cara Mengatasinya</h2>
<p><strong>SQLSTATE Access denied.</strong> Periksa kembali <code>DB_USERNAME</code>, <code>DB_PASSWORD</code>, dan nama database di file <code>.env</code>. Setelah mengubah <code>.env</code>, tidak perlu restart apapun kecuali config di-cache.</p>
<p><strong>MassAssignmentException.</strong> Kamu lupa menambahkan kolom ke <code>$fillable</code> di model. Tambahkan nama kolom yang error ke array tersebut.</p>
<p><strong>Halaman 404 saat buka /products.</strong> Pastikan route resource sudah didaftarkan di <code>routes/web.php</code> dan tidak ada typo pada nama controller.</p>
<p><strong>Perubahan tidak tersimpan.</strong> Cek validasi di controller. Jika validasi gagal, Laravel mengembalikan ke form sebelumnya beserta pesan error, jadi perhatikan bagian <code>@error</code> di Blade.</p>
<h2>FAQ: Pertanyaan Seputar CRUD Laravel</h2>
<p><strong>Apa itu CRUD dalam Laravel?</strong><br />
CRUD adalah empat operasi dasar pengelolaan data yaitu Create (membuat), Read (membaca), Update (mengubah), dan Delete (menghapus). Di Laravel, keempatnya dipetakan rapi ke dalam resource controller dengan tujuh method standar.</p>
<p><strong>Apakah tutorial ini bisa dipakai untuk Laravel 11?</strong><br />
Bisa, dengan sedikit penyesuaian. Struktur dasar resource controller, migration, dan Blade hampir sama. Namun beberapa detail seperti persyaratan versi PHP bisa berbeda, jadi sesuaikan dengan dokumentasi versi yang kamu pakai.</p>
<p><strong>Apakah harus bisa PHP dulu sebelum belajar Laravel?</strong><br />
Sangat disarankan memahami dasar PHP seperti variabel, fungsi, array, dan <a href="https://ramzilhuda.com/ide-bisnis-yang-bisa-anda-pertimbangkan-di-bidang-platform-syariah/">konsep</a> OOP (class dan object). Tanpa dasar itu, kode Laravel akan terasa seperti sulap.</p>
<p><strong>Bagaimana cara menampilkan pesan error validasi?</strong><br />
Gunakan directive <code>@error('nama_field')</code> di file Blade tepat di bawah input yang bersangkutan. Laravel otomatis mengirim pesan error kembali ke form jika validasi di controller gagal.</p>
<p><strong>Apa langkah selanjutnya setelah menguasai CRUD?</strong><br />
Pelajari autentikasi (login dan register), relasi antar tabel di Eloquent, upload file, dan pembuatan REST API. REST API adalah kelanjutan alami karena pola controller-nya mirip dengan yang baru saja kamu pelajari.</p>
<h2>Penutup</h2>
<p>Kamu baru saja membangun aplikasi CRUD lengkap di Laravel 12: instalasi, migration, model, resource controller, route, dan tampilan Blade. Pola ini akan terus kamu temui di hampir semua proyek Laravel, jadi pastikan kamu benar-benar memahaminya sebelum lanjut.</p>
<p>Langkah alami berikutnya adalah mengubah CRUD ini menjadi REST API, karena pola controller-nya sangat mirip. Baca juga panduan kami tentang cara membuat REST API dengan Laravel untuk melanjutkan perjalanan belajarmu.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramzilhuda.com/tutorial-laravel-12-crud-pemula/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1290</post-id>	</item>
	</channel>
</rss>
