<?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/category/tutorial/feed/" rel="self" type="application/rss+xml" />
	<link>https://ramzilhuda.com</link>
	<description>Belajar dan Sharing Ilmu Teknologi</description>
	<lastBuildDate>Mon, 19 Oct 2026 04:17:24 +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>Membuat Form Validasi di Laravel 12: Aturan dan Pesan Error Kustom</title>
		<link>https://ramzilhuda.com/membuat-form-validasi-laravel-12/</link>
					<comments>https://ramzilhuda.com/membuat-form-validasi-laravel-12/#respond</comments>
		
		<dc:creator><![CDATA[ramzilhuda]]></dc:creator>
		<pubDate>Tue, 10 Nov 2026 02:00:59 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[form request]]></category>
		<category><![CDATA[form validasi laravel]]></category>
		<category><![CDATA[laravel 12]]></category>
		<category><![CDATA[tutorial laravel]]></category>
		<category><![CDATA[validasi laravel]]></category>
		<guid isPermaLink="false">https://ramzilhuda.com/?p=1424</guid>

					<description><![CDATA[Form tanpa validasi adalah pintu terbuka bagi data sampah. Bayangkan form pendaftaran yang bisa diisi dengan email asal-asalan, kata sandi satu karakter, atau kolom nama yang dikosongkan. Data seperti itu akan merusak database dan pengalaman pengguna. Kabar baiknya, form validasi Laravel 12 membuat urusan ini sangat mudah: hanya dengan beberapa baris kode, setiap input dari [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Form tanpa validasi adalah pintu terbuka bagi data sampah. Bayangkan form pendaftaran yang bisa diisi dengan email asal-asalan, kata sandi satu karakter, atau kolom nama yang dikosongkan. Data seperti itu akan merusak <a href="https://ramzilhuda.com/mengenal-server-peran-dan-tipe-server-yang-perlu-diketahui/">database</a> dan pengalaman pengguna. Kabar baiknya, form validasi <a href="https://ramzilhuda.com/cara-membuat-project-sederhana-menggunakan-laravel-part-1/">Laravel</a> 12 membuat urusan ini sangat mudah: hanya dengan beberapa baris kode, setiap input dari pengguna bisa diperiksa otomatis sebelum disimpan.</p>
<p>Artikel ini membahas tuntas cara membuat form validasi di Laravel 12, mulai dari <a href="https://ramzilhuda.com/metode-numerik-metode-newton-raphson/">metode</a> <code>$request-&gt;validate()</code> yang paling cepat, daftar aturan validasi yang paling sering dipakai, cara membuat pesan error kustom dalam Bahasa Indonesia, sampai merapikan kode memakai Form Request class. Di akhir ada contoh menampilkan error di Blade dan tips memakai validasi untuk REST API.</p>
<p><img data-recalc-dims="1" decoding="async" alt="Diagram alur validasi form di Laravel" src="https://i0.wp.com/ramzilhuda.com/wp-content/uploads/2026/10/batch3-19-isi.webp?ssl=1" /></p>
<h2>Kenapa Validasi Form Itu Wajib</h2>
<p>Validasi adalah proses memastikan data yang dikirim pengguna memenuhi syarat sebelum diproses lebih lanjut. Tanpa validasi, <a href="https://ramzilhuda.com/bagaimana-cara-melihata-whatasapp-kita-di-intai-orang-lain/">aplikasi</a> rentan terhadap tiga masalah besar. Pertama, data tidak konsisten, misalnya kolom email berisi teks biasa atau tanggal lahir berisi angka acak. Kedua, celah keamanan, karena input berbahaya bisa lolos ke database. Ketiga, pengalaman pengguna yang buruk, karena kesalahan baru ketahuan belakangan tanpa penjelasan yang jelas.</p>
<p>Laravel menyelesaikan ketiga masalah ini dengan sistem validasi yang ekspresif. Kamu cukup mendeklarasikan aturan dalam bentuk array, dan Laravel otomatis memeriksa input, mengembalikan pengguna ke form sebelumnya bila ada yang salah, lengkap dengan pesan error dan input lama yang sudah terisi. Semua ini terjadi tanpa kamu menulis <a href="https://ramzilhuda.com/logika-proposisi-matematika-diskrit/">logika</a> pengecekan manual yang panjang.</p>
<h2>Cara Kerja $request-&gt;validate() untuk Form Validasi Laravel 12</h2>
<p>Cara tercepat memvalidasi form adalah memanggil metode <code>validate()</code> pada objek <code>$request</code> di dalam controller. Perhatikan contoh berikut untuk form pembuatan artikel.</p>
<pre><code class="language-php">&lt;?php

namespace App\Http\Controllers;

use App\Models\Post;
use Illuminate\Http\Request;

class PostController extends Controller
{
    public function create()
    {
        return view('posts.create');
    }

    public function store(Request $request)
    {
        $validated = $request-&gt;validate([
            'title'       =&gt; 'required|string|min:5|max:100',
            'slug'        =&gt; 'required|string|unique:posts,slug',
            'body'        =&gt; 'required|string|min:20',
            'category_id' =&gt; 'required|exists:categories,id',
            'published_at'=&gt; 'nullable|date',
        ]);

        Post::create($validated);

        return redirect('/posts')-&gt;with('success', 'Artikel berhasil disimpan.');
    }
}
</code></pre>
<p>Ada tiga hal penting dari kode di atas. Pertama, aturan ditulis sebagai string yang dipisahkan karakter pipe (<code>|</code>), misalnya <code>required|string|min:5</code>. Kedua, metode <code>validate()</code> mengembalikan array <code>$validated</code> yang hanya berisi field yang lolos aturan, sehingga aman langsung dipakai untuk <code>Post::create()</code>. Ketiga, jika validasi gagal, Laravel otomatis mengembalikan (redirect back) pengguna ke halaman form sebelumnya sambil membawa pesan error dan input lama, jadi kamu tidak perlu menulis logika itu sendiri.</p>
<p>Kalau kamu mengikuti seri Laravel di blog ini dari <a href="/tutorial-laravel-12-crud-pemula/">tutorial CRUD Laravel 12</a>, pola di atas akan terasa familiar karena melengkapi proses store dan update yang sudah dibahas di sana.</p>
<h2>Aturan Form Validasi Laravel 12 yang Paling Sering Dipakai</h2>
<p>Laravel menyediakan puluhan aturan validasi siap pakai. Berikut tabel aturan yang paling sering dipakai dalam form validasi Laravel 12 beserta artinya.</p>
<table>
<thead>
<tr>
<th>Aturan</th>
<th>Arti</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>required</code></td>
<td>Field wajib diisi, tidak boleh kosong</td>
</tr>
<tr>
<td><code>string</code></td>
<td>Nilai harus berupa string</td>
</tr>
<tr>
<td><code>numeric</code></td>
<td>Nilai harus berupa angka</td>
</tr>
<tr>
<td><code>email</code></td>
<td>Nilai harus berformat email yang valid</td>
</tr>
<tr>
<td><code>min:5</code></td>
<td>Panjang minimal 5 karakter (atau nilai minimal 5 untuk angka)</td>
</tr>
<tr>
<td><code>max:100</code></td>
<td>Panjang maksimal 100 karakter</td>
</tr>
<tr>
<td><code>unique:posts,slug</code></td>
<td>Nilai harus unik di kolom <code>slug</code> tabel <code>posts</code></td>
</tr>
<tr>
<td><code>exists:categories,id</code></td>
<td>Nilai harus ada di kolom <code>id</code> tabel <code>categories</code></td>
</tr>
<tr>
<td><code>confirmed</code></td>
<td>Harus ada field <code>{nama}_confirmation</code> yang nilainya sama (untuk kata sandi)</td>
</tr>
<tr>
<td><code>date</code></td>
<td>Nilai harus berupa tanggal yang valid</td>
</tr>
<tr>
<td><code>nullable</code></td>
<td>Field boleh kosong (null)</td>
</tr>
<tr>
<td><code>image</code></td>
<td>File harus berupa gambar (jpeg, png, bmp, gif, svg, webp)</td>
</tr>
<tr>
<td><code>mimes:pdf,docx</code></td>
<td>File harus berekstensi sesuai daftar</td>
</tr>
<tr>
<td><code>in:admin,user</code></td>
<td>Nilai harus salah satu dari daftar yang disebut</td>
</tr>
</tbody>
</table>
<p>Aturan <code>unique</code> dan <code>exists</code> sangat berguna karena langsung memeriksa ke database tanpa query manual. Contoh <code>unique:users,email</code> memastikan tidak ada dua pengguna dengan email yang sama, sedangkan <code>exists:categories,id</code> memastikan kategori yang dipilih benar-benar ada.</p>
<p>Untuk form edit data, aturan <code>unique</code> perlu pengecualian agar data milik sendiri tidak dianggap duplikat. Caranya dengan menambahkan ID yang dikecualikan, contoh: <code>unique:posts,slug,10</code> (mengabaikan baris ber-ID 10) atau memakai sintaks lengkap <code>Rule::unique('posts')-&gt;ignore($post-&gt;id)</code>.</p>
<h2>Membuat Pesan Error Kustom Bahasa Indonesia</h2>
<p>Secara bawaan, pesan error validasi Laravel berbahasa Inggris, misalnya &#8220;The title field is required.&#8221; Untuk aplikasi berbahasa Indonesia, kamu bisa menggantinya dengan pesan kustom lewat parameter kedua metode <code>validate()</code>.</p>
<pre><code class="language-php">$validated = $request-&gt;validate(
    [
        'title'    =&gt; 'required|string|min:5|max:100',
        'email'    =&gt; 'required|email|unique:users,email',
        'password' =&gt; 'required|string|min:8|confirmed',
    ],
    [
        'title.required'      =&gt; 'Judul wajib diisi.',
        'title.min'           =&gt; 'Judul minimal :min karakter.',
        'title.max'           =&gt; 'Judul maksimal :max karakter.',
        'email.required'      =&gt; 'Alamat email wajib diisi.',
        'email.email'         =&gt; 'Format email tidak valid.',
        'email.unique'        =&gt; 'Email ini sudah terdaftar, silakan pakai email lain.',
        'password.required'   =&gt; 'Kata sandi wajib diisi.',
        'password.min'        =&gt; 'Kata sandi minimal :min karakter.',
        'password.confirmed'  =&gt; 'Konfirmasi kata sandi tidak sama.',
    ]
);
</code></pre>
<p>Kunci array pesan memakai format <code>{nama_field}.{nama_aturan}</code>, sehingga kamu bisa mengatur pesan berbeda untuk tiap kombinasi field dan aturan. Placeholder seperti <code>:min</code> dan <code>:max</code> otomatis diganti Laravel dengan angka dari aturan yang dipakai, jadi pesan tetap dinamis.</p>
<p>Jika pesan kustom dipakai di banyak form, pendekatan yang lebih rapi adalah menerjemahkan seluruh file bahasa validasi. Salin file <code>lang/en/validation.php</code> menjadi <code>lang/id/validation.php</code>, ubah isinya ke Bahasa Indonesia, lalu set <code>'locale' =&gt; 'id'</code> di <code>config/app.php</code>. Dengan begitu seluruh aplikasi memakai pesan Bahasa Indonesia tanpa mengulang array pesan di setiap controller.</p>
<h2>Merapikan Kode dengan Form Request Class</h2>
<p>Ketika aturan validasi mulai banyak, menaruhnya di controller membuat metode <code>store()</code> terlihat penuh. Solusi resminya adalah Form Request: class khusus yang menampung aturan validasi, pesan kustom, dan logika otorisasi. Buat dengan Artisan:</p>
<pre><code class="language-bash">php artisan make:request StorePostRequest
</code></pre>
<p>Perintah itu menghasilkan file <code>app/Http/Requests/StorePostRequest.php</code>. Isi dengan aturan dan pesanmu:</p>
<pre><code class="language-php">&lt;?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StorePostRequest extends FormRequest
{
    public function authorize(): bool
    {
        return true;
    }

    public function rules(): array
    {
        return [
            'title'       =&gt; 'required|string|min:5|max:100',
            'slug'        =&gt; 'required|string|unique:posts,slug',
            'body'        =&gt; 'required|string|min:20',
            'category_id' =&gt; 'required|exists:categories,id',
        ];
    }

    public function messages(): array
    {
        return [
            'title.required'  =&gt; 'Judul wajib diisi.',
            'title.min'       =&gt; 'Judul minimal :min karakter.',
            'slug.unique'     =&gt; 'Slug ini sudah dipakai artikel lain.',
            'body.required'   =&gt; 'Isi artikel wajib diisi.',
            'category_id.exists' =&gt; 'Kategori yang dipilih tidak valid.',
        ];
    }
}
</code></pre>
<p>Metode <code>authorize()</code> menentukan apakah pengguna boleh melakukan request ini; kembalikan <code>true</code> untuk mengizinkan semua, atau tulis logika izin di sana. Lalu pakai class ini sebagai type-hint di controller:</p>
<pre><code class="language-php">use App\Http\Requests\StorePostRequest;

public function store(StorePostRequest $request)
{
    $validated = $request-&gt;validated();

    Post::create($validated);

    return redirect('/posts')-&gt;with('success', 'Artikel berhasil disimpan.');
}
</code></pre>
<p>Validasi berjalan otomatis sebelum kode di dalam metode dieksekusi. Controller menjadi bersih dan hanya fokus pada logika <a href="https://ramzilhuda.com/ide-bisnis-yang-bisa-anda-pertimbangkan-di-bidang-platform-syariah/">bisnis</a>. Pola Form Request ini juga dipakai di form autentikasi seperti pada <a href="/tutorial-laravel-12-login-register-breeze/">tutorial login dan register dengan Breeze</a>, sehingga layak kamu kuasai sejak awal.</p>
<h2>Membuat Aturan Validasi Sendiri</h2>
<p>Kadang aturan bawaan tidak cukup, misalnya kamu ingin menolak judul yang mengandung kata terlarang tertentu. Laravel 12 menyediakan perintah Artisan untuk membuat rule kustom.</p>
<pre><code class="language-bash">php artisan make:rule NoSpamWord
</code></pre>
<p>Perintah itu membuat class <code>app/Rules/NoSpamWord.php</code>. Implementasikan logika di metode <code>validate()</code>:</p>
<pre><code class="language-php">&lt;?php

namespace App\Rules;

use Closure;
use Illuminate\Contracts\Validation\ValidationRule;

class NoSpamWord implements ValidationRule
{
    public function validate(string $attribute, mixed $value, Closure $fail): void
    {
        $kataTerlarang = ['gratis', 'promo', 'diskon'];

        foreach ($kataTerlarang <a href="https://ramzilhuda.com/meta-didenda-13-miliar-atas-transfer-data-ke-as/">as</a> $kata) {
            if (str_contains(strtolower($value), $kata)) {
                $fail('Kolom :attribute mengandung kata yang tidak diizinkan.');
                return;
            }
        }
    }
}
</code></pre>
<p>Pakai rule kustom ini seperti aturan biasa dengan membuat instance-nya di array aturan:</p>
<pre><code class="language-php">use App\Rules\NoSpamWord;

$request-&gt;validate([
    'title' =&gt; ['required', 'string', 'min:5', new NoSpamWord],
]);
</code></pre>
<p>Perhatikan bahwa aturannya ditulis sebagai array (bukan string pipe) ketika dicampur dengan objek rule. Placeholder <code>:attribute</code> otomatis diganti dengan nama field. Rule kustom cocok untuk logika bisnis yang spesifik dan dipakai di banyak form.</p>
<h2>Menampilkan Error di Blade</h2>
<p>Pesan error yang dihasilkan validasi tersedia di view lewat variabel <code>$errors</code>. Pola yang umum dipakai adalah menampilkan ringkasan di atas form dan pesan per field di bawah inputnya.</p>
<pre><code class="language-blade">@if ($errors-&gt;any())
    &lt;div class=&quot;alert alert-danger&quot;&gt;
        &lt;ul&gt;
            @foreach ($errors-&gt;all() as $error)
                &lt;li&gt;{{ $error }}&lt;/li&gt;
            @endforeach
        &lt;/ul&gt;
    &lt;/div&gt;
@endif

&lt;form method=&quot;POST&quot; action=&quot;/posts&quot;&gt;
    @csrf

    &lt;label for=&quot;title&quot;&gt;Judul&lt;/label&gt;
    &lt;input type=&quot;text&quot; name=&quot;title&quot; id=&quot;title&quot; value=&quot;{{ old('title') }}&quot;&gt;
    @error('title')
        &lt;small class=&quot;text-danger&quot;&gt;{{ $message }}&lt;/small&gt;
    @enderror

    &lt;label for=&quot;body&quot;&gt;Isi Artikel&lt;/label&gt;
    &lt;textarea name=&quot;body&quot; id=&quot;body&quot;&gt;{{ old('body') }}&lt;/textarea&gt;
    @error('body')
        &lt;small class=&quot;text-danger&quot;&gt;{{ $message }}&lt;/small&gt;
    @enderror

    &lt;button type=&quot;submit&quot;&gt;Simpan&lt;/button&gt;
&lt;/form&gt;
</code></pre>
<p>Directive <code>@error('title')</code> hanya merender isinya jika field <code>title</code> memiliki pesan error, dan variabel <code>$message</code> berisi teks error tersebut. Fungsi <code>old('title')</code> mengisi kembali input dengan nilai yang dikirim pengguna sebelumnya, sehingga mereka tidak perlu mengetik ulang seluruh form hanya karena satu field salah. Kombinasi ketiganya menghasilkan form yang ramah pengguna dengan sedikit kode.</p>
<h2>Tips Validasi untuk REST API</h2>
<p>Untuk endpoint API, perilaku bawaan <code>validate()</code> yang me-redirect kurang cocok karena klien API mengharapkan respons JSON. Laravel menanganinya otomatis: jika request memiliki header <code>Accept: application/json</code>, kegagalan validasi mengembalikan respons JSON berisi pesan error dengan status 422, tanpa redirect. Jadi aturan yang sama bisa dipakai ulang untuk API.</p>
<p>Untuk struktur API yang lebih terkontrol, validasi juga bisa dilakukan manual dengan <code>Validator::make()</code> agar kamu mengatur sendiri format responsnya. Pembahasan lengkap pola ini ada di artikel <a href="/cara-membuat-rest-api-laravel/">cara membuat REST API dengan Laravel</a> yang sudah terbit di blog ini.</p>
<h2>Kesimpulan</h2>
<p>Form validasi Laravel 12 memberimu tiga lapis kemudahan: <code>$request-&gt;validate()</code> untuk kebutuhan cepat, pesan error kustom Bahasa Indonesia agar pengguna paham kesalahannya, dan Form Request class untuk kode yang rapi dan bisa dipakai ulang. Aturan seperti <code>required</code>, <code>unique</code>, <code>exists</code>, dan <code>confirmed</code> mencakup sebagian besar kebutuhan form sehari-hari tanpa query manual.</p>
<p>Mulailah dengan menerapkan validasi pada satu form yang sudah kamu buat, misalnya form tambah artikel dari seri CRUD, lalu pindahkan aturannya ke Form Request saat form mulai kompleks. Kalau kamu ingin mendalami alur autentikasi yang juga mengandalkan validasi berat, baca juga <a href="/tutorial-laravel-12-login-register-breeze/">tutorial Laravel 12 membuat fitur login dan register dengan Breeze</a> sebagai latihan berikutnya.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramzilhuda.com/membuat-form-validasi-laravel-12/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1424</post-id>	</item>
		<item>
		<title>Cara Menggunakan Composer: Install dan Update Package Laravel</title>
		<link>https://ramzilhuda.com/cara-menggunakan-composer-laravel/</link>
					<comments>https://ramzilhuda.com/cara-menggunakan-composer-laravel/#respond</comments>
		
		<dc:creator><![CDATA[ramzilhuda]]></dc:creator>
		<pubDate>Sun, 08 Nov 2026 02:00:20 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[composer]]></category>
		<category><![CDATA[dependency manager]]></category>
		<category><![CDATA[laravel]]></category>
		<category><![CDATA[php package]]></category>
		<category><![CDATA[tutorial laravel]]></category>
		<guid isPermaLink="false">https://ramzilhuda.com/?p=1415</guid>

					<description><![CDATA[Setiap proyek Laravel modern berdiri di atas puluhan package pihak ketiga: routing, ORM, validasi, sampai autentikasi, semuanya dikelola oleh satu tool bernama Composer. Memahami cara menggunakan Composer Laravel dengan benar adalah skill wajib karena hampir setiap tutorial Laravel, termasuk seri di blog ini, memintamu menjalankan perintah composer require di titik tertentu. Composer adalah dependency manager [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Setiap proyek <a href="https://ramzilhuda.com/cara-membuat-project-sederhana-menggunakan-laravel-part-1/">Laravel</a> modern berdiri di atas puluhan package pihak ketiga: routing, ORM, validasi, sampai autentikasi, semuanya dikelola oleh satu tool bernama Composer. Memahami cara menggunakan Composer Laravel dengan benar adalah skill wajib karena hampir setiap tutorial Laravel, termasuk seri di blog ini, memintamu menjalankan perintah <code>composer require</code> di titik tertentu.</p>
<p>Composer adalah dependency manager untuk PHP, artinya tugasnya mengunduh, memperbarui, dan mengatur library yang dibutuhkan proyekmu beserta seluruh dependensinya. Tanpa Composer, kamu harus mengunduh library satu per satu secara manual dan pusing mengatur versi yang cocok. Dengan Composer, satu perintah cukup untuk menyelesaikan semuanya dengan aman dan konsisten.</p>
<p><img data-recalc-dims="1" decoding="async" alt="Alur kerja Composer menginstal dan memperbarui package" src="https://i0.wp.com/ramzilhuda.com/wp-content/uploads/2026/10/batch3-17-isi.webp?ssl=1" /></p>
<h2>Cara Menggunakan Composer Laravel: Pengenalan dan Fungsi</h2>
<p>Analogi paling pas untuk Composer adalah manajer paket seperti Play Store, tetapi untuk kode PHP. Saat proyekmu butuh fitur tertentu, misalnya manajemen hak akses pengguna, kamu tidak perlu menulisnya dari nol. Kamu cukup meminta Composer menginstal package yang sudah teruji oleh komunitas, dan Composer mengurus sisanya: mengunduh versi yang cocok, memastikan tidak bentrok dengan package lain, dan mendaftarkannya agar bisa dipakai.</p>
<p>Tiga file adalah jantung cara kerja Composer. File <code>composer.json</code> berisi daftar package yang dibutuhkan proyek beserta versinya, dan file ini wajib masuk version control seperti Git. File <code>composer.lock</code> mencatat versi persis yang terinstal saat ini agar semua anggota tim memakai versi identik. Folder <code>vendor</code> berisi kode package yang diunduh, dan folder ini tidak boleh masuk Git karena bisa dibuat ulang kapan saja dengan satu perintah.</p>
<p>Setiap proyek Laravel yang kamu buat dengan <code>laravel new</code> sebenarnya sudah memakai Composer di balik layar. Jadi kemungkinan besar kamu sudah menjadi pengguna Composer tanpa sadar. Artikel ini membuatmu memahaminya secara sadar dan percaya diri.</p>
<h2>Menginstal Composer di Windows</h2>
<p>Bila kamu mengikuti <a href="https://ramzilhuda.com/cara-install-xampp-php-pertama/">Cara Install XAMPP dan Menjalankan Program PHP Pertama</a>, PHP sudah tersedia di komputermu dan Composer bisa langsung dipasang. Unduh installer resmi dari getcomposer.org, tepatnya file Composer-Setup.exe untuk Windows.</p>
<p>Jalankan installer dan pada langkah pemilihan PHP, arahkan ke file <code>php.exe</code> milik XAMPP yang biasanya ada di <code>C:\xampp\php\php.exe</code>. Installer akan mendaftarkan Composer ke PATH Windows sehingga perintah <code>composer</code> bisa dijalankan dari terminal mana pun. Selesaikan wizard sampai akhir, lalu tutup dan buka kembali terminal agar perubahan PATH terbaca.</p>
<p>Untuk pengguna yang memakai PHP terpisah atau Laragon, prinsipnya sama: tunjukkan installer ke <code>php.exe</code> yang aktif dipakai. Bila kamu memakai lebih dari satu versi PHP, pastikan Composer menunjuk ke versi yang sama dengan yang dipakai proyekmu untuk menghindari konflik dependensi.</p>
<h2>Verifikasi: Memastikan Composer Terpasang Benar</h2>
<p>Buka Command Prompt atau PowerShell baru, lalu jalankan perintah berikut.</p>
<pre><code class="language-bash">composer --version
</code></pre>
<p>Bila muncul tulisan seperti <code>Composer version 2.x.x</code>, instalasi berhasil. Angka 2 di depan menandakan Composer versi 2 yang jauh lebih cepat dan hemat memori dibanding versi 1. Bila perintah tidak dikenali, berarti PATH belum terbaca: tutup semua jendela terminal, buka yang baru, dan coba lagi. Bila masih gagal, ulangi instalasi dan pastikan opsi penambahan ke PATH tidak dilewatkan.</p>
<p>Perintah berguna kedua untuk verifikasi adalah <code>composer diagnose</code>, yang memeriksa koneksi ke repositori package dan memberi tahu bila ada masalah jaringan atau konfigurasi. Jalankan sesekali bila instalasi package gagal tanpa pesan yang jelas.</p>
<h2>Memahami composer.json dan composer.lock</h2>
<p>Buka file <code>composer.json</code> di proyek Laravel-mu dan perhatikan strukturnya. Bagian <code>require</code> berisi package wajib beserta batasan versinya, sedangkan <code>require-dev</code> berisi package khusus pengembangan seperti testing yang tidak ikut ke production.</p>
<pre><code class="language-json">{
    &quot;require&quot;: {
        &quot;php&quot;: &quot;^8.2&quot;,
        &quot;laravel/framework&quot;: &quot;^12.0&quot;,
        &quot;spatie/laravel-permission&quot;: &quot;^6.0&quot;
    },
    &quot;require-dev&quot;: {
        &quot;phpunit/phpunit&quot;: &quot;^11.0&quot;
    }
}
</code></pre>
<p>Tanda <code>^</code> (caret) artinya boleh memakai versi minor dan patch terbaru selama versi major-nya sama. Jadi <code>^12.0</code> mengizinkan 12.1 atau 12.9, tetapi tidak 13.0. Aturan ini menjaga kompatibilitas sambil tetap mendapat perbaikan bug otomatis.</p>
<p>File <code>composer.lock</code> dibuat otomatis saat pertama kali dependensi diinstal. Ia mengunci versi persis setiap package termasuk dependensi transitifnya. Saat rekan tim menjalankan <code>composer install</code>, Composer membaca file lock ini sehingga semua orang mendapat versi yang identik. Inilah kenapa <code>composer.lock</code> wajib di-commit ke Git, sedangkan folder <code>vendor</code> tidak.</p>
<h2>Empat Perintah Composer yang Wajib Dikuasai</h2>
<p>Hampir semua pekerjaan Composer sehari-hari hanya memakai empat perintah berikut. Pahami perbedaannya baik-baik karena tertukar memakainya adalah sumber bug klasik.</p>
<p><strong>composer require</strong> dipakai untuk menambah package baru ke proyek. Perintah ini mengunduh package, menambahkannya ke <code>composer.json</code>, dan memperbarui <code>composer.lock</code> sekaligus.</p>
<pre><code class="language-bash">composer require spatie/laravel-permission
</code></pre>
<p><strong>composer update</strong> dipakai untuk menaikkan versi package yang sudah ada ke versi terbaru sesuai batasan di <code>composer.json</code>. Hati-hati: perintah tanpa argumen ini memperbarui SEMUA package sekaligus, yang berisiko bila ada perubahan breaking. Untuk aman, sebutkan nama package-nya secara spesifik.</p>
<pre><code class="language-bash">composer update spatie/laravel-permission
</code></pre>
<p><strong>composer remove</strong> adalah kebalikan dari require: menghapus package dari proyek, <code>composer.json</code>, dan <code>composer.lock</code> sekaligus.</p>
<pre><code class="language-bash">composer remove spatie/laravel-permission
</code></pre>
<p><strong>composer install</strong> dipakai saat kamu baru meng-clone proyek dari Git. Perintah ini membaca <code>composer.lock</code> dan mengunduh versi persis yang terkunci, sehingga lingkunganmu identik dengan tim. Inilah perintah pertama yang harus dijalankan setiap menerima proyek Laravel dari orang lain, sebelum <code>php artisan migrate</code> atau perintah lainnya.</p>
<p>Selain empat perintah utama, ada dua perintah bantu yang berguna untuk audit. Perintah <code>composer show</code> menampilkan daftar package yang terinstal beserta versinya, sedangkan <code>composer outdated</code> menunjukkan package mana yang sudah punya versi lebih baru tersedia. Keduanya bersifat read-only sehingga aman dijalankan kapan saja tanpa mengubah apa pun di proyekmu.</p>
<h2>Autoload PSR-4: Cara Composer Menemukan Class-mu</h2>
<p>Salah satu keajaiban Composer yang jarang disadari pemula adalah autoloading. Dulu developer PHP harus menulis <code>require</code> manual untuk setiap file class. Composer menghilangkan kebutuhan itu lewat standar PSR-4 yang memetakan namespace ke struktur folder.</p>
<p>Lihat bagian <code>autoload</code> di <code>composer.json</code> proyek Laravel.</p>
<pre><code class="language-json">&quot;autoload&quot;: {
    &quot;psr-4&quot;: {
        &quot;App\\&quot;: &quot;app/&quot;,
        &quot;Database\\Factories\\&quot;: &quot;database/factories/&quot;
    }
}
</code></pre>
<p>Artinya class <code>App\Models\Post</code> otomatis dipetakan ke file <code>app/Models/Post.php</code>. Selama kamu mengikuti konvensi penamaan ini, kamu tidak pernah perlu menulis <code>require</code> manual. Setiap kali menambah namespace baru, jalankan <code>composer dump-autoload</code> agar peta autoload dibuat ulang.</p>
<p>Pemahaman ini menjelaskan kenapa perintah Artisan seperti <code>make:model</code> selalu menaruh file di lokasi yang tepat. Framework dan Composer sudah sepakat soal konvensi, dan tugasmu hanyalah mengikutinya.</p>
<h2>Cara Menggunakan Composer Laravel: Studi Kasus Install Package Nyata</h2>
<p>Mari praktikkan alur lengkap dengan package nyata yang populer: <code>spatie/laravel-permission</code> untuk manajemen role dan permission. Package ini dipakai ribuan proyek production dan menjadi contoh sempurna.</p>
<p>Langkah pertama, instal package-nya di proyek Laravel-mu.</p>
<pre><code class="language-bash">composer require spatie/laravel-permission
</code></pre>
<p>Composer akan mengunduh package beserta dependensinya, lalu memperbarui <code>composer.json</code> dan <code>composer.lock</code>. Perhatikan outputnya: Composer memberitahu versi persis yang dipasang dan apakah ada dependensi tambahan yang ikut diunduh.</p>
<p>Langkah kedua, publikasikan file konfigurasi dan migrasinya memakai Artisan.</p>
<pre><code class="language-bash">php artisan vendor:publish --provider=&quot;Spatie\Permission\PermissionServiceProvider&quot;
php artisan migrate
</code></pre>
<p>Perintah pertama menyalin file konfigurasi package ke proyekmu sehingga bisa disesuaikan, sedangkan yang kedua membuat tabel <code>roles</code>, <code>permissions</code>, dan tabel pivotnya di <a href="https://ramzilhuda.com/mengenal-server-peran-dan-tipe-server-yang-perlu-diketahui/">database</a>. Pola dua langkah ini, install lalu publish, berlaku untuk hampir semua package Laravel.</p>
<p>Langkah ketiga, pasang trait-nya ke <a href="https://ramzilhuda.com/tujuan-mengevaluasi-model-artificial-neural-network-dengan-cross-validation/">model</a> User agar bisa memakai fitur role.</p>
<pre><code class="language-php">// app/Models/User.php
namespace App\Models;

use Spatie\Permission\Traits\HasRoles;
use Illuminate\Foundation\Auth\User <a href="https://ramzilhuda.com/meta-didenda-13-miliar-atas-transfer-data-ke-as/">as</a> Authenticatable;

class User extends Authenticatable
{
    use HasRoles;

    // ... kode model lainnya
}
</code></pre>
<p>Sekarang kamu bisa menulis kode seperti <code>$user-&gt;assignRole('admin')</code> atau memeriksa dengan <code>$user-&gt;hasRole('admin')</code> di mana saja. Satu perintah Composer tadi telah memberimu sistem manajemen hak akses yang butuh berminggu-minggu bila ditulis dari nol. Inilah alasan kenapa ekosistem package PHP begitu powerful.</p>
<h2>Kesalahan Umum Saat Memakai Composer</h2>
<p>Pertama, menjalankan <code>composer update</code> tanpa argumen di proyek production lalu kaget ada package yang berubah perilaku. Di production, selalu pakai <code>composer install</code> yang membaca file lock, bukan update. Kedua, meng-commit folder <code>vendor</code> ke Git sehingga repository membengkak dan konflik tidak perlu terjadi. Pastikan <code>vendor/</code> ada di file <code>.gitignore</code>, yang untungnya sudah bawaan di proyek Laravel baru.</p>
<p>Ketiga, lupa menjalankan <code>composer install</code> setelah clone proyek lalu bingung kenapa <code>php artisan</code> error Class not found. Keempat, konflik versi saat require package lama ke Laravel baru. Baca pesan error Composer baik-baik karena ia biasanya menjelaskan package mana yang meminta versi PHP atau Laravel yang berbeda, lalu cari versi package yang mendukung versimu.</p>
<p>Kelima, memakai perintah Composer dengan user root di Linux tanpa flag yang tepat sehingga file vendor terkunci permission-nya. Di Windows masalah ini jarang terjadi, tetapi di VPS atau WSL, jalankan Composer sebagai user biasa, bukan root.</p>
<p>Keenam, menjalankan perintah Composer di folder yang salah sehingga muncul error bahwa file composer.json tidak ditemukan. Selalu pastikan terminalmu berada di root proyek Laravel, yaitu folder yang berisi file composer.json dan artisan, sebelum menjalankan perintah apa pun.</p>
<h2>Langkah Selanjutnya</h2>
<p>Kamu sekarang bisa menginstal Composer, memakai empat perintah intinya dengan tepat, memahami peran <code>composer.json</code> dan <code>composer.lock</code>, serta memasang package nyata sampai bisa dipakai di kode. Ini adalah fondasi workflow PHP modern yang dipakai di setiap proyek profesional.</p>
<p>Satu kebiasaan yang layak dibangun mulai sekarang adalah mengeksplorasi Packagist, direktori resmi tempat semua package PHP terdaftar. Sebelum menulis kode sendiri untuk kebutuhan umum seperti manipulasi tanggal, ekspor Excel, atau kirim email, cari dulu di Packagist, siapa tahu sudah ada package matang yang terawat. Untuk menjaga proyek tetap sehat, jalankan <code>composer outdated</code> sesekali guna melihat package mana yang punya versi baru, lalu perbarui satu per satu sambil membaca changelog-nya. Kebiasaan kecil ini menghindarkanmu dari package kedaluwarsa yang diam-diam menyimpan celah keamanan.</p>
<p>Package yang baru saja dipasang paling terasa manfaatnya saat dipadukan dengan sistem autentikasi. Lanjutkan ke <a href="https://ramzilhuda.com/tutorial-laravel-12-login-register-breeze/">Tutorial Laravel 12: Membuat Fitur Login dan Register dengan Breeze</a> untuk melengkapi proyekmu dengan login yang aman. Dan bila kamu ingin mengulang dasar membangun <a href="https://ramzilhuda.com/bagaimana-cara-melihata-whatasapp-kita-di-intai-orang-lain/">aplikasi</a> dari nol sebelum menambah package, <a href="https://ramzilhuda.com/tutorial-laravel-12-crud-pemula/">Tutorial Laravel 12: Membuat CRUD Sederhana dari Nol untuk Pemula</a> adalah tempat latihan yang tepat.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramzilhuda.com/cara-menggunakan-composer-laravel/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1415</post-id>	</item>
		<item>
		<title>Tutorial Laravel 12: Relasi Database Eloquent One to Many</title>
		<link>https://ramzilhuda.com/tutorial-laravel-12-relasi-eloquent/</link>
					<comments>https://ramzilhuda.com/tutorial-laravel-12-relasi-eloquent/#respond</comments>
		
		<dc:creator><![CDATA[ramzilhuda]]></dc:creator>
		<pubDate>Fri, 06 Nov 2026 02:00:33 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[eloquent]]></category>
		<category><![CDATA[laravel]]></category>
		<category><![CDATA[one to many]]></category>
		<category><![CDATA[relasi database]]></category>
		<category><![CDATA[tutorial laravel]]></category>
		<guid isPermaLink="false">https://ramzilhuda.com/?p=1407</guid>

					<description><![CDATA[Aplikasi nyata hampir tidak pernah menyimpan data dalam satu tabel saja. Sebuah blog punya banyak post, dan setiap post punya banyak komentar. Kemampuan menghubungkan tabel-tabel inilah yang disebut relasi database, dan di Laravel relasi ini dikelola dengan elegan oleh Eloquent ORM. Tutorial relasi Eloquent Laravel one to many ini akan membawamu dari konsep dasar sampai [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="https://ramzilhuda.com/bagaimana-cara-melihata-whatasapp-kita-di-intai-orang-lain/">Aplikasi</a> nyata hampir tidak pernah menyimpan data dalam satu tabel saja. Sebuah blog punya banyak post, dan setiap post punya banyak komentar. Kemampuan menghubungkan tabel-tabel inilah yang disebut relasi <a href="https://ramzilhuda.com/mengenal-server-peran-dan-tipe-server-yang-perlu-diketahui/">database</a>, dan di <a href="https://ramzilhuda.com/cara-membuat-project-sederhana-menggunakan-laravel-part-1/">Laravel</a> relasi ini dikelola dengan elegan oleh Eloquent ORM. Tutorial relasi Eloquent Laravel one to many ini akan membawamu dari <a href="https://ramzilhuda.com/ide-bisnis-yang-bisa-anda-pertimbangkan-di-bidang-platform-syariah/">konsep</a> dasar sampai praktik lengkap: mendefinisikan <code>hasMany</code> dan <code>belongsTo</code>, membuat migrasi dengan foreign key, sampai mengatasi masalah performa N+1 dengan eager loading.</p>
<p>Studi kasus kita sederhana dan dekat dengan dunia nyata: satu Post bisa memiliki banyak Comment, sedangkan setiap Comment hanya milik satu Post. Pola inilah yang disebut one to many, relasi paling umum yang akan kamu temui di hampir setiap aplikasi. Setelah menguasainya, relasi lain seperti many to many akan terasa jauh lebih mudah dipahami.</p>
<p><img data-recalc-dims="1" decoding="async" alt="Diagram relasi one to many antara Post dan Comment" src="https://i0.wp.com/ramzilhuda.com/wp-content/uploads/2026/10/batch3-15-isi.webp?ssl=1" /></p>
<h2>Relasi Eloquent Laravel One to Many: Konsep Dasarnya</h2>
<p>Sebelum menyentuh kode, pahami dulu anatomi relasi one to many. Di sisi database, tabel <code>comments</code> menyimpan kolom <code>post_id</code> yang menunjuk ke kolom <code>id</code> di tabel <code>posts</code>. Kolom <code>post_id</code> inilah yang disebut foreign key, yaitu kunci tamu yang menjadi jembatan antar tabel.</p>
<p>Di sisi Eloquent, relasi ini didefinisikan dari dua arah yang saling melengkapi. Dari sisi Post, relasinya dibaca sebagai &#8220;satu post memiliki banyak comment&#8221; dan ditulis dengan method <code>hasMany</code>. Dari sisi Comment, relasinya dibaca sebagai &#8220;satu comment milik satu post&#8221; dan ditulis dengan method <code>belongsTo</code>. Kedua method ini ditaruh di dalam class <a href="https://ramzilhuda.com/tujuan-mengevaluasi-model-artificial-neural-network-dengan-cross-validation/">model</a> masing-masing.</p>
<p>Konvensi penamaan Laravel sangat membantumu di sini. Bila kamu mengikuti konvensi (model <code>Post</code> untuk tabel <code>posts</code>, foreign key <code>post_id</code>), Eloquent bisa menebak semuanya secara otomatis tanpa konfigurasi tambahan. Kamu hanya perlu menulis method relasinya, dan sisanya ditangani framework.</p>
<h2>Persiapan: Model dan Migrasi Post serta Comment</h2>
<p>Kita mulai dari migrasi. Buat model beserta migrasinya dengan perintah Artisan berikut. Flag <code>-m</code> membuat file migrasi sekalian.</p>
<pre><code class="language-bash">php artisan make:model Post -m
php artisan make:model Comment -m
</code></pre>
<p>Buka file migrasi <code>posts</code> dan isi dengan kolom yang dibutuhkan. Karena ini studi kasus blog sederhana, kolomnya cukup judul, isi, dan timestamps bawaan.</p>
<pre><code class="language-php">// database/migrations/xxxx_create_posts_table.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    public function up(): void
    {
        Schema::create('posts', function (Blueprint $table) {
            $table-&gt;id();
            $table-&gt;string('judul');
            $table-&gt;text('isi');
            $table-&gt;timestamps();
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('posts');
    }
};
</code></pre>
<p>Selanjutnya migrasi <code>comments</code>. Inilah bagian pentingnya: tambahkan <code>foreignId('post_id')</code> yang dirantai dengan <code>constrained()</code> agar Laravel otomatis membuat foreign key ke tabel <code>posts</code>, plus <code>onDelete('cascade')</code> supaya komentar ikut terhapus saat post induknya dihapus.</p>
<pre><code class="language-php">// database/migrations/xxxx_create_comments_table.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    public function up(): void
    {
        Schema::create('comments', function (Blueprint $table) {
            $table-&gt;id();
            $table-&gt;foreignId('post_id')
                  -&gt;constrained()
                  -&gt;onDelete('cascade');
            $table-&gt;string('nama_komentator');
            $table-&gt;text('isi_komentar');
            $table-&gt;timestamps();
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('comments');
    }
};
</code></pre>
<p>Method <code>constrained()</code> akan menebak tabel tujuan dari nama kolom: <code>post_id</code> berarti tabel <code>posts</code> kolom <code>id</code>. Bila penamaanmu tidak mengikuti konvensi, kamu bisa menyebutkannya eksplisit seperti <code>constrained('posts', 'id')</code>. Setelah kedua migrasi siap, jalankan <code>php artisan migrate</code> untuk membuat tabelnya di database. Pastikan konfigurasi database di file <code>.env</code> sudah benar, seperti yang dibahas di <a href="https://ramzilhuda.com/belajar-mysql-untuk-pemula/">Belajar MySQL untuk Pemula</a>.</p>
<h2>Relasi Eloquent Laravel One to Many: hasMany dan belongsTo di Model</h2>
<p>Sekarang buka model <code>Post</code> dan tambahkan method relasi <code>comments</code>. Nama method memakai bentuk jamak karena satu post punya banyak comment, dan return type-nya adalah <code>HasMany</code>.</p>
<pre><code class="language-php">// app/Models/Post.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;

class Post extends Model
{
    protected $fillable = ['judul', 'isi'];

    public function comments(): HasMany
    {
        return $this-&gt;hasMany(Comment::class);
    }
}
</code></pre>
<p>Lalu buka model <code>Comment</code> dan tambahkan method <code>post</code> dengan return type <code>BelongsTo</code>. Nama method memakai bentuk tunggal karena satu comment hanya milik satu post.</p>
<pre><code class="language-php">// app/Models/Comment.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class Comment extends Model
{
    protected $fillable = ['post_id', 'nama_komentator', 'isi_komentar'];

    public function post(): BelongsTo
    {
        return $this-&gt;belongsTo(Post::class);
    }
}
</code></pre>
<p>Perhatikan bahwa <code>$fillable</code> pada Comment menyertakan <code>post_id</code> agar bisa diisi massal saat membuat komentar baru. Dengan dua method ini, Eloquent sekarang paham hubungan kedua tabel. Kamu bisa mengakses <code>$post-&gt;comments</code> untuk mendapat koleksi komentar, atau <code>$comment-&gt;post</code> untuk mendapat post induknya, tanpa menulis satu pun query SQL manual.</p>
<h2>Praktik: Menyimpan dan Membaca Data Berelasi</h2>
<p>Relasi yang sudah didefinisikan membuat kode penyimpanan data menjadi sangat ekspresif. Untuk membuat comment yang otomatis terhubung ke post tertentu, cukup panggil relasinya lalu method <code>create</code>.</p>
<pre><code class="language-php">use App\Models\Post;

$post = Post::find(1);

// Membuat comment yang otomatis terisi post_id = 1
$post-&gt;comments()-&gt;create([
    'nama_komentator' =&gt; 'Ani',
    'isi_komentar' =&gt; 'Artikelnya sangat membantu, terima kasih!',
]);
</code></pre>
<p>Bentuk <code>$post-&gt;comments()</code> dengan tanda kurung mengembalikan query builder relasi sehingga kamu bisa merantainya dengan <code>create</code>, <code>where</code>, atau <code>count</code>. Sedangkan <code>$post-&gt;comments</code> tanpa tanda kurung langsung mengeksekusi dan mengembalikan koleksi hasil. Perbedaan kecil ini penting dan sering membingungkan pemula, jadi hafalkan polanya.</p>
<p>Untuk membaca, kamu bisa mengakses relasi dari kedua arah dengan natural.</p>
<pre><code class="language-php">// Dari post ke comments-nya
$post = Post::find(1);
foreach ($post-&gt;comments <a href="https://ramzilhuda.com/meta-didenda-13-miliar-atas-transfer-data-ke-as/">as</a> $comment) {
    echo $comment-&gt;nama_komentator . ': ' . $comment-&gt;isi_komentar . "\n";
}

// Dari comment ke post induknya
$comment = Comment::find(5);
echo $comment-&gt;post-&gt;judul;
</code></pre>
<p>Tampilkan di Blade juga semudah itu. Contoh menampilkan daftar post beserta komentarnya:</p>
<pre><code class="language-blade">@foreach ($posts as $post)
  &lt;h2&gt;{{ $post-&gt;judul }}&lt;/h2&gt;
  &lt;p&gt;{{ $post-&gt;isi }}&lt;/p&gt;

  &lt;h4&gt;Komentar ({{ $post-&gt;comments-&gt;count() }})&lt;/h4&gt;
  &lt;ul&gt;
    @foreach ($post-&gt;comments as $comment)
      &lt;li&gt;&lt;strong&gt;{{ $comment-&gt;nama_komentator }}:&lt;/strong&gt; {{ $comment-&gt;isi_komentar }}&lt;/li&gt;
    @endforeach
  &lt;/ul&gt;
@endforeach
</code></pre>
<h2>Waspadai Masalah N+1 dan Atasi dengan Eager Loading</h2>
<p>Ada satu jebakan performa yang wajib kamu pahami sejak awal: masalah N+1 query. Perhatikan kode controller berikut yang terlihat wajar tetapi bermasalah.</p>
<pre><code class="language-php">// CARA LAMBAT: memicu N+1 query
$posts = Post::all(); // 1 query untuk mengambil semua post

foreach ($posts as $post) {
    echo $post-&gt;comments-&gt;count(); // +1 query untuk SETIAP post!
}
</code></pre>
<p>Bila ada 50 post, kode ini menjalankan 1 query untuk posts ditambah 50 query untuk comments, total 51 query. Inilah N+1: satu query awal plus N query tambahan. Pada data kecil tidak terasa, tetapi di production dengan ribuan baris, halamanmu bisa menjadi sangat lambat.</p>
<p>Solusinya adalah eager loading dengan method <code>with()</code>, yang memuat relasi sekaligus dalam query tambahan yang efisien.</p>
<pre><code class="language-php">// CARA CEPAT: hanya 2 query untuk semua data
$posts = Post::with('comments')-&gt;get(); // 1 query posts + 1 query comments

foreach ($posts as $post) {
    echo $post-&gt;comments-&gt;count(); // tidak ada query baru, data sudah dimuat
}
</code></pre>
<p>Eloquent akan menjalankan satu query untuk semua comments yang <code>post_id</code>-nya cocok, lalu mencocokkannya di memori. Hasilnya selalu hanya 2 query berapa pun jumlah post-nya. Aturan praktisnya: setiap kali kamu mengakses relasi di dalam loop, pastikan relasi itu dimuat dengan <code>with()</code> di awal. Kamu juga bisa memuat relasi bertingkat seperti <code>with('comments.user')</code> bila comment berelasi lagi ke tabel users.</p>
<h2>Relasi di Route dan Controller: Contoh Lengkap</h2>
<p>Mari rangkai semuanya dalam contoh controller nyata yang menampilkan satu post beserta komentarnya, plus form tambah komentar. Pertama daftarkan route-nya.</p>
<pre><code class="language-php">// routes/web.php
use App\Http\Controllers\PostController;

Route::get('/posts/{post}', [PostController::class, 'show'])-&gt;name('posts.show');
Route::post('/posts/{post}/comments', [PostController::class, 'storeComment'])
    -&gt;name('posts.comments.store');
</code></pre>
<p>Lalu buat controllernya. Perhatikan penggunaan <code>with('comments')</code> untuk eager loading dan validasi input sebelum menyimpan.</p>
<pre><code class="language-php">// app/Http/Controllers/PostController.php
namespace App\Http\Controllers;

use App\Models\Post;
use Illuminate\Http\Request;

class PostController extends Controller
{
    public function show(Post $post)
    {
        // Muat ulang post beserta comments-nya secara eager
        $post-&gt;load('comments');

        return view('posts.show', compact('post'));
    }

    public function storeComment(Request $request, Post $post)
    {
        $validated = $request-&gt;validate([
            'nama_komentator' =&gt; 'required|max:100',
            'isi_komentar' =&gt; 'required|max:1000',
        ]);

        $post-&gt;comments()-&gt;create($validated);

        return redirect()-&gt;route('posts.show', $post)
            -&gt;with('sukses', 'Komentar berhasil ditambahkan.');
    }
}
</code></pre>
<p>Teknik <code>Route::get('/posts/{post}')</code> yang dipasangkan dengan parameter <code>Post $post</code> disebut route model binding: Laravel otomatis mengambilkan model Post berdasarkan ID di URL. Ini menghemat kode pencarian manual dan sudah mengikuti praktik terbaik Laravel 12.</p>
<h2>Kesalahan Umum Saat Membuat Relasi Eloquent</h2>
<p>Beberapa error klasik yang sering ditemui pemula beserta penyebabnya. Pertama, error Class not found pada relasi biasanya karena lupa mengimpor class model terkait dengan <code>use App\Models\Comment;</code> di atas file. Kedua, foreign key tidak terbentuk karena urutan migrasi salah: migrasi <code>posts</code> harus berjalan sebelum <code>comments</code>, jadi perhatikan timestamp pada nama file migrasi.</p>
<p>Ketiga, mass assignment error saat create biasanya karena <code>post_id</code> belum masuk ke <code>$fillable</code> pada model Comment. Keempat, relasi mengembalikan null atau koleksi kosong padahal data ada di database. Cek apakah nama method relasi, nama foreign key, dan konvensi tabel semuanya konsisten. Bila memakai nama tabel atau kolom yang tidak standar, sebutkan eksplisit di parameter <code>hasMany</code> dan <code>belongsTo</code>, misalnya <code>$this-&gt;hasMany(Comment::class, 'tulisan_id')</code>.</p>
<h2>Langkah Selanjutnya</h2>
<p>Kamu sekarang bisa memodelkan relasi one to many dengan benar: migrasi foreign key lewat <code>foreignId</code> dan <code>constrained()</code>, method <code>hasMany</code> dan <code>belongsTo</code> di model, sampai teknik eager loading untuk menghindari N+1 query. Ini adalah skill database yang dipakai di hampir setiap proyek Laravel profesional.</p>
<p>Relasi ini juga menjadi fondasi untuk topik lanjutan seperti many to many dengan tabel pivot, polymorphic relations, dan API Resources yang menyajikan data berelasi sebagai JSON. Untuk melihat bagaimana data berelasi disajikan ke aplikasi lain, lanjutkan ke <a href="https://ramzilhuda.com/cara-membuat-rest-api-laravel/">Cara Membuat REST API dengan Laravel: Panduan Lengkap untuk Pemula</a>. Dan bila kamu ingin mengulang dasar pengelolaan data tunggal sebelum melangkah lebih jauh, <a href="https://ramzilhuda.com/tutorial-laravel-12-crud-pemula/">Tutorial Laravel 12: Membuat CRUD Sederhana dari Nol untuk Pemula</a> selalu siap menjadi tempatmu berlatih lagi.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramzilhuda.com/tutorial-laravel-12-relasi-eloquent/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1407</post-id>	</item>
		<item>
		<title>Cara Install XAMPP dan Menjalankan Program PHP Pertama</title>
		<link>https://ramzilhuda.com/cara-install-xampp-php-pertama/</link>
					<comments>https://ramzilhuda.com/cara-install-xampp-php-pertama/#respond</comments>
		
		<dc:creator><![CDATA[ramzilhuda]]></dc:creator>
		<pubDate>Thu, 05 Nov 2026 02:00:10 +0000</pubDate>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Tutorial Pemrograman]]></category>
		<category><![CDATA[apache mysql]]></category>
		<category><![CDATA[install xampp]]></category>
		<category><![CDATA[php pemula]]></category>
		<category><![CDATA[web server lokal]]></category>
		<category><![CDATA[xampp]]></category>
		<guid isPermaLink="false">https://ramzilhuda.com/?p=1394</guid>

					<description><![CDATA[Sebelum belajar membuat aplikasi web dengan PHP atau framework seperti Laravel, kamu butuh satu hal penting: web server lokal di komputermu sendiri. Di sinilah XAMPP berperan. Panduan cara install XAMPP ini akan membawamu dari nol sampai bisa menjalankan program PHP pertamamu, lengkap dengan cara menyalakan Apache dan MySQL, memahami folder htdocs, dan membuat form sederhana [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Sebelum belajar membuat <a href="https://ramzilhuda.com/bagaimana-cara-melihata-whatasapp-kita-di-intai-orang-lain/">aplikasi</a> web dengan PHP atau framework seperti <a href="https://ramzilhuda.com/cara-membuat-project-sederhana-menggunakan-laravel-part-1/">Laravel</a>, kamu butuh satu hal penting: web <a href="https://ramzilhuda.com/mengenal-server-peran-dan-tipe-server-yang-perlu-diketahui/">server</a> lokal di komputermu sendiri. Di sinilah XAMPP berperan. Panduan cara install XAMPP ini akan membawamu dari nol sampai bisa menjalankan program PHP pertamamu, lengkap dengan cara menyalakan Apache dan MySQL, memahami folder htdocs, dan membuat form sederhana yang memproses data.</p>
<p>XAMPP adalah paket gratis berisi Apache (web server), MySQL atau MariaDB (database), PHP, dan Perl dalam satu instalasi. Tanpa XAMPP, file PHP yang kamu tulis tidak bisa dijalankan karena browser hanya memahami HTML, CSS, dan JavaScript. Dengan XAMPP, komputermu berubah menjadi server web mini tempat kamu bereksperimen sebebasnya tanpa biaya hosting.</p>
<p><img data-recalc-dims="1" decoding="async" src="https://i0.wp.com/ramzilhuda.com/wp-content/uploads/2026/10/batch3-14-isi.webp?ssl=1" alt="Tampilan XAMPP Control Panel dengan Apache dan MySQL" /></p>
<h2>Cara Install XAMPP: Persiapan Sebelum Mulai</h2>
<p>Sebelum mengunduh, pastikan komputermu memenuhi syarat yang ringan ini. XAMPP berjalan baik di Windows 10 atau 11 dengan RAM minimal 4 GB dan ruang disk kosong sekitar 2 GB. Kamu juga butuh hak akses administrator saat instalasi karena XAMPP perlu mendaftarkan service dan membuka port jaringan lokal.</p>
<p>Satu catatan penting untuk pengguna Windows: nonaktifkan dulu antivirus yang terlalu agresif atau tambahkan folder instalasi ke daftar pengecualian bila instalasi gagal di tengah jalan. Beberapa antivirus salah mendeteksi komponen XAMPP sebagai ancaman. Selain itu, pastikan tidak ada aplikasi lain yang sedang memakai port 80, seperti Skype versi lama atau IIS, karena ini penyebab paling umum Apache gagal start. Kita bahas solusinya di bagian troubleshooting.</p>
<h2>Langkah 1: Download XAMPP dari Situs Resmi</h2>
<p>Selalu unduh XAMPP dari situs resminya di apachefriends.org. Jangan mengunduh dari situs pihak ketiga karena berisiko disisipi malware. Di halaman utama situs tersebut, pilih versi untuk Windows, lalu unduh installer versi PHP terbaru yang tersedia. Ukuran file installer biasanya sekitar 150 sampai 160 MB, jadi pastikan koneksi internetmu stabil.</p>
<p>Pilih versi PHP terbaru yang ditawarkan karena tutorial ini memakai sintaks PHP 8 yang modern. Versi lama seperti PHP 7 masih bisa dipakai, tetapi beberapa fitur baru tidak akan tersedia. Setelah file installer selesai diunduh, jangan buru-buru menjalankannya bila kamu memakai Windows dengan User Account Control yang ketat. Klik kanan file installer lalu pilih Run <a href="https://ramzilhuda.com/meta-didenda-13-miliar-atas-transfer-data-ke-as/">as</a> administrator agar proses instalasi berjalan lancar.</p>
<h2>Cara Install XAMPP di Windows: Menjalankan Installer</h2>
<p>Jalankan installer dan ikuti wizard yang muncul. Pada layar pemilihan komponen, biarkan semua komponen tercentang bila ruang diskmu cukup, atau minimal pastikan Apache, MySQL, PHP, dan phpMyAdmin terpilih. Keempat komponen inilah yang akan paling sering kamu pakai.</p>
<p>Selanjutnya installer menanyakan folder tujuan. Lokasi defaultnya adalah <code>C:\xampp</code> dan sangat disarankan untuk tidak mengubahnya. Banyak tutorial dan konfigurasi mengasumsikan XAMPP ada di lokasi ini, sehingga mengubahnya hanya menambah potensi masalah. Hindari juga menginstal di dalam <code>C:\Program Files</code> karena izin foldernya lebih ketat dan sering menimbulkan error permission.</p>
<p>Klik Next sampai instalasi selesai. Prosesnya memakan waktu beberapa menit tergantung kecepatan disk. Bila Windows Firewall menampilkan peringatan dan meminta izin akses jaringan untuk Apache atau MySQL, pilih Allow access agar keduanya bisa berjalan normal.</p>
<h2>Langkah 3: Menyalakan Apache dan MySQL Lewat Control Panel</h2>
<p>Setelah instalasi selesai, buka XAMPP Control Panel dari Start Menu. Jendela ini adalah pusat kendalimu: setiap service punya tombol Start dan Stop masing-masing. Untuk mulai ngoding PHP, kamu cukup menyalakan dua service: Apache dan MySQL.</p>
<p>Klik tombol Start pada baris Apache. Bila berhasil, latar barisnya berubah hijau dan tertulis Running beserta nomor PID dan port (biasanya 80 dan 443). Lakukan hal yang sama untuk MySQL yang biasanya berjalan di port 3306. Bila salah satunya gagal start dan barisnya berwarna merah, jangan panik dulu dan langsung lompat ke bagian troubleshooting di akhir artikel.</p>
<p>Untuk memastikan Apache benar-benar hidup, buka browser dan ketik <code>http://localhost</code> di address bar. Bila muncul halaman selamat datang XAMPP, berarti web server lokalmu sudah berjalan sempurna. Alamat <code>localhost</code> ini setara dengan <code>127.0.0.1</code>, yaitu alamat yang menunjuk ke komputermu sendiri.</p>
<p>Selagi MySQL berjalan, kamu juga bisa membuka <code>http://localhost/phpmyadmin</code> di browser untuk melihat phpMyAdmin, yaitu aplikasi web bawaan XAMPP untuk mengelola database lewat tampilan grafis. Kamu belum perlu memakainya sekarang, tetapi ketahui saja bahwa ia ada dan siap dipakai saat kamu mulai belajar database di artikel berikutnya.</p>
<h2>Mengenal Folder htdocs: Tempat Menyimpan Proyekmu</h2>
<p>Semua file web yang ingin dijalankan lewat XAMPP harus disimpan di dalam folder <code>htdocs</code>, yang berlokasi di <code>C:\xampp\htdocs</code>. Anggap folder ini sebagai root atau halaman depan dari server lokalmu. Setiap subfolder di dalamnya otomatis menjadi alamat web tersendiri.</p>
<p>Contohnya, bila kamu membuat folder <code>C:\xampp\htdocs\belajar</code>, maka isinya bisa diakses lewat <code>http://localhost/belajar</code> di browser. File bernama <code>index.php</code> di dalam folder itu akan terbuka otomatis saat kamu mengunjungi alamat foldernya, sama seperti perilaku hosting sungguhan. Pola inilah yang dipakai semua developer PHP di seluruh dunia untuk pengembangan lokal.</p>
<p>Satu aturan emas: jangan pernah menyimpan file PHP di folder lain seperti Documents lalu membukanya langsung dengan double click. File yang dibuka langsung tanpa lewat <code>http://localhost</code> tidak diproses oleh PHP, sehingga kode PHP-mu hanya tampil sebagai teks mentah atau tidak berjalan sama sekali.</p>
<h2>Program PHP Pertama: Menampilkan phpinfo dan Halo Dunia</h2>
<p>Sekarang saatnya menulis kode PHP pertama. Buka Notepad atau VS Code, lalu buat file bernama <code>info.php</code> di dalam <code>C:\xampp\htdocs</code> dengan isi berikut.</p>
<pre><code class="language-php">&lt;?php
phpinfo();
?&gt;
</code></pre>
<p>Simpan, lalu buka <code>http://localhost/info.php</code> di browser. Bila muncul halaman panjang berisi informasi konfigurasi PHP, selamat, PHP-mu bekerja. Fungsi <code>phpinfo()</code> ini sangat berguna untuk memeriksa versi PHP dan ekstensi yang aktif. Setelah yakin berhasil, hapus file <code>info.php</code> karena membiarkannya di server production bisa membocorkan informasi sistem.</p>
<p>Selanjutnya buat program legendaris setiap pemula: halo dunia. Buat file <code>halo.php</code> di folder <code>htdocs</code> dengan isi berikut.</p>
<pre><code class="language-php">&lt;?php
$nama = "Budi";
$umur = 20;
?&gt;
&lt;!DOCTYPE html&gt;
&lt;html lang="id"&gt;
&lt;head&gt;
  &lt;meta charset="UTF-8"&gt;
  &lt;title&gt;Halo Dunia&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;h1&gt;Halo dunia!&lt;/h1&gt;
  &lt;p&gt;Nama saya &lt;?php echo $nama; ?&gt;, umur saya &lt;?php echo $umur; ?&gt; tahun.&lt;/p&gt;
  &lt;p&gt;Hari ini: &lt;?php echo date("l, d F Y"); ?&gt;&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>
<p>Buka <code>http://localhost/halo.php</code> dan perhatikan hasilnya. Kode di antara <code>&lt;?php</code> dan <code>?&gt;</code> dieksekusi di server, sedangkan sisanya dikirim apa adanya sebagai HTML. Fungsi <code>date()</code> menampilkan tanggal server sesuai format yang diminta. Pola mencampur PHP dan HTML seperti inilah dasar dari semua aplikasi PHP, termasuk yang dibangun dengan framework modern.</p>
<h2>Membuat Form GET Sederhana dan Memproses Datanya</h2>
<p>Program statis memang menyenangkan di awal, tetapi kekuatan PHP sesungguhnya adalah memproses data dari pengguna. Contoh paling sederhana adalah form yang mengirim data lewat method GET. Buat file <code>sapa.php</code> di folder <code>htdocs</code> dengan isi berikut.</p>
<pre><code class="language-php">&lt;!DOCTYPE html&gt;
&lt;html lang="id"&gt;
&lt;head&gt;
  &lt;meta charset="UTF-8"&gt;
  &lt;title&gt;Form Sapa&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;h1&gt;Form Sapaan&lt;/h1&gt;
  &lt;form method="GET" action="sapa.php"&gt;
    &lt;label&gt;Nama kamu: &lt;input type="text" name="nama" required&gt;&lt;/label&gt;
    &lt;button type="submit"&gt;Kirim&lt;/button&gt;
  &lt;/form&gt;

  &lt;?php if (isset($_GET["nama"])): ?&gt;
    &lt;p&gt;
      Halo, &lt;?php echo htmlspecialchars($_GET["nama"]); ?&gt;!
      Senang bertemu denganmu.
    &lt;/p&gt;
  &lt;?php endif; ?&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>
<p>Cara kerjanya begini. Saat form disubmit, browser mengirim data ke URL yang sama dengan parameter di address bar, misalnya <code>sapa.php?nama=Ani</code>. PHP menangkapnya lewat array superglobal <code>$_GET</code>. Fungsi <code>isset()</code> memeriksa apakah parameternya ada sebelum dipakai, supaya tidak muncul warning saat halaman pertama kali dibuka. Fungsi <code>htmlspecialchars()</code> wajib dipakai setiap menampilkan input pengguna untuk mencegah serangan XSS, yaitu kode jahat yang disisipkan lewat form.</p>
<p>Coba isi form dengan namamu lalu perhatikan address bar berubah. Itulah karakteristik method GET: datanya terlihat di URL. Untuk data sensitif seperti password, method POST lebih tepat karena datanya tidak tampil di URL. Prinsip memproses input form inilah yang nantinya berkembang menjadi fitur login, pendaftaran, dan CRUD lengkap.</p>
<h2>Masalah Umum Saat Install XAMPP dan Cara Mengatasinya</h2>
<p>Hampir setiap pemula menabrak minimal satu masalah berikut. Tenang, semuanya ada solusinya.</p>
<p><strong>Apache tidak bisa start, port 80 sudah dipakai.</strong> Ini masalah nomor satu. Penyebab umum adalah Skype, IIS, atau aplikasi lain yang menduduki port 80. Solusi termudah: tutup aplikasi penyebabnya. Alternatifnya, ubah port Apache menjadi 8080 lewat tombol Config lalu Apache (httpd.conf), cari baris <code>Listen 80</code> dan ubah menjadi <code>Listen 8080</code>, kemudian akses situsmu lewat <code>http://localhost:8080</code>.</p>
<p><strong>MySQL tidak bisa start.</strong> Biasanya karena sudah ada instalasi MySQL lain yang berjalan sebagai service Windows. Buka Services, cari service MySQL yang bukan milik XAMPP, lalu hentikan atau ubah menjadi manual. Setelah itu start ulang MySQL dari XAMPP Control Panel.</p>
<p><strong>Akses ditolak atau error permission.</strong> Terjadi bila XAMPP diinstal tanpa Run as administrator atau ditaruh di folder dengan izin ketat. Solusinya: jalankan XAMPP Control Panel sebagai administrator dengan klik kanan lalu Run as administrator.</p>
<p><strong>Halaman localhost tidak tampil.</strong> Pastikan Apache berstatus Running berwarna hijau di Control Panel, lalu coba <code>http://127.0.0.1</code> sebagai alternatif <code>http://localhost</code>. Bila tetap gagal, restart Apache dari Control Panel.</p>
<h2>Langkah Selanjutnya Setelah XAMPP Berjalan</h2>
<p>Kamu sekarang punya lingkungan pengembangan PHP yang lengkap: Apache melayani halaman, MySQL siap menyimpan data, dan kamu sudah bisa menulis serta memproses program PHP. Ini fondasi yang sama dipakai developer profesional sebelum mengerjakan proyek sungguhan.</p>
<p>Langkah berikutnya yang paling masuk akal adalah berkenalan dengan database MySQL karena hampir semua aplikasi web menyimpannya di sana. Baca panduan <a href="https://ramzilhuda.com/belajar-mysql-untuk-pemula/">Belajar MySQL untuk Pemula: Membuat Database, Tabel, dan Query Dasar</a> untuk melanjutkan dari titik ini. Setelah nyaman dengan database, saatnya naik kelas ke framework: <a href="https://ramzilhuda.com/tutorial-laravel-12-crud-pemula/">Tutorial Laravel 12: Membuat CRUD Sederhana dari Nol untuk Pemula</a> memakai XAMPP sebagai server lokalnya dan akan terasa jauh lebih mudah karena kamu sudah paham cara kerja di balik layarnya.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramzilhuda.com/cara-install-xampp-php-pertama/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1394</post-id>	</item>
		<item>
		<title>Tutorial JavaScript untuk Pemula: Variabel, Fungsi, dan Manipulasi DOM</title>
		<link>https://ramzilhuda.com/tutorial-javascript-untuk-pemula/</link>
					<comments>https://ramzilhuda.com/tutorial-javascript-untuk-pemula/#respond</comments>
		
		<dc:creator><![CDATA[ramzilhuda]]></dc:creator>
		<pubDate>Wed, 04 Nov 2026 02:00:48 +0000</pubDate>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Tutorial Pemrograman]]></category>
		<category><![CDATA[belajar javascript]]></category>
		<category><![CDATA[dom javascript]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[pemrograman web]]></category>
		<category><![CDATA[tutorial javascript]]></category>
		<guid isPermaLink="false">https://ramzilhuda.com/?p=1390</guid>

					<description><![CDATA[JavaScript adalah bahasa pemrograman yang membuat halaman web menjadi hidup dan interaktif. Tombol yang bisa diklik, form yang memvalidasi input secara otomatis, sampai mode gelap yang berubah hanya dengan satu sentuhan, semuanya digerakkan oleh JavaScript. Kalau kamu mengikuti tutorial JavaScript pemula ini sampai selesai, kamu akan menguasai tiga fondasi terpentingnya: variabel, fungsi, dan manipulasi DOM, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>JavaScript adalah bahasa pemrograman yang membuat halaman web menjadi hidup dan interaktif. Tombol yang bisa diklik, form yang memvalidasi input secara otomatis, sampai mode gelap yang berubah hanya dengan satu sentuhan, semuanya digerakkan oleh JavaScript. Kalau kamu mengikuti tutorial JavaScript pemula ini sampai selesai, kamu akan menguasai tiga fondasi terpentingnya: variabel, fungsi, dan manipulasi DOM, lengkap dengan contoh program nyata berupa tombol toggle dark mode yang bisa langsung kamu coba di browser.</p>
<p>Kabar baiknya, kamu tidak perlu menginstal apa pun untuk mulai belajar. Cukup buka browser Chrome atau Edge, tekan F12 untuk membuka DevTools, lalu pilih tab Console. Di sanalah kamu bisa mengetik dan menjalankan kode JavaScript secara langsung. Untuk latihan yang lebih serius, kamu bisa memakai VS Code sebagai editor kode. Kalau belum memasangnya, baca dulu panduan <a href="https://ramzilhuda.com/ekstensi-vs-code-terbaik-mahasiswa/">7 Ekstensi VS Code Wajib untuk Mahasiswa dan Programmer Pemula</a> agar pengalaman ngodingmu lebih nyaman sejak awal.</p>
<p><img data-recalc-dims="1" decoding="async" src="https://i0.wp.com/ramzilhuda.com/wp-content/uploads/2026/10/batch3-13-isi.webp?ssl=1" alt="Contoh kode JavaScript manipulasi DOM di editor" /></p>
<h2>Tutorial JavaScript Pemula: Persiapan dan Cara Menjalankan Kode</h2>
<p>Sebelum menulis baris pertama, pahami dulu di mana kode JavaScript dijalankan. Ada dua tempat utama. Pertama, di browser melalui tab Console DevTools seperti yang sudah disebutkan. Cara ini paling cepat untuk bereksperimen dengan potongan kode kecil. Kedua, di dalam file HTML memakai tag script, yang akan kita pakai pada studi kasus di bagian akhir artikel ini.</p>
<p>Aturan mainnya sederhana. Setiap contoh kode pada artikel ini memakai sintaks modern JavaScript (ES6 ke atas) yang didukung semua browser terbaru. Kamu disarankan mengetik ulang setiap contoh, bukan sekadar menyalinnya, karena otot jarimu perlu terbiasa dengan sintaksnya. Kalau muncul error berwarna merah di Console, jangan panik. Baca pesannya baik-baik karena pesan error JavaScript biasanya cukup jelas menunjukkan baris yang bermasalah.</p>
<p>Satu kebiasaan penting sejak awal: biasakan memberi nama variabel dan fungsi yang deskriptif dalam bahasa Inggris, misalnya <code>namaMahasiswa</code> atau <code>hitungTotal</code>, bukan <code>x</code> atau <code>data1</code>. Kode yang kamu tulis hari ini akan kamu baca lagi minggu depan, dan nama yang jelas menghemat banyak waktu.</p>
<h2>Mengenal Variabel: let, const, dan var</h2>
<p>Variabel adalah wadah untuk menyimpan data. Di JavaScript modern ada dua kata kunci utama untuk membuat variabel, yaitu <code>let</code> dan <code>const</code>. Kamu mungkin juga menemukan <code>var</code> di kode-kode lama, tetapi untuk proyek baru sebaiknya hindari <code>var</code> karena perilakunya yang membingungkan terkait cakupan variabel.</p>
<p>Gunakan <code>const</code> untuk nilai yang tidak akan berubah setelah dibuat, dan <code>let</code> untuk nilai yang memang perlu diubah. Aturan praktisnya: selalu mulai dengan <code>const</code>, ganti ke <code>let</code> hanya bila kamu benar-benar perlu mengubah nilainya.</p>
<pre><code class="language-javascript">const namaKampus = "STT <a href="https://ramzilhuda.com/mengenang-zaman-radio-di-payakumbuh-dan-lima-puluh-kota/">Payakumbuh</a>";
let semester = 3;

console.log(namaKampus); // STT Payakumbuh
console.log(semester);   // 3

semester = 4; // boleh, karena memakai let
console.log(semester); // 4

// namaKampus = "Kampus Lain"; // ERROR: tidak boleh mengubah const
</code></pre>
<p>Perhatikan bahwa mengubah isi dari <code>const</code> yang berupa object atau array masih diperbolehkan, yang dilarang adalah mengganti seluruh referensinya. Ini <a href="https://ramzilhuda.com/ide-bisnis-yang-bisa-anda-pertimbangkan-di-bidang-platform-syariah/">konsep</a> yang akan terasa manfaatnya saat kamu bekerja dengan data yang kompleks.</p>
<pre><code class="language-javascript">const mahasiswa = { nama: "Budi", ipk: 3.5 };
mahasiswa.ipk = 3.7; // boleh: mengubah isi properti
console.log(mahasiswa.ipk); // 3.7
</code></pre>
<h2>Tipe Data Dasar yang Wajib Dikuasai</h2>
<p>JavaScript punya beberapa tipe data dasar. Lima yang paling sering dipakai pemula adalah <code>string</code> (teks), <code>number</code> (angka), <code>boolean</code> (benar atau salah), <code>null</code> (kosong yang disengaja), dan <code>undefined</code> (belum diberi nilai). Kamu bisa memeriksa tipe sebuah nilai dengan operator <code>typeof</code>.</p>
<pre><code class="language-javascript">const nama = "Ani";          // string
const umur = 20;             // number
const lulus = true;          // boolean
let nilai = null;            // null
let alamat;                  // undefined

console.log(typeof nama);  // "string"
console.log(typeof umur);  // "number"
console.log(typeof lulus); // "boolean"
</code></pre>
<p>Satu hal unik JavaScript adalah ia tidak membedakan integer dan desimal, semuanya bertipe <code>number</code>. Operasi aritmetika dasar memakai simbol yang sudah familier: tambah (<code>+</code>), kurang (<code>-</code>), kali (<code>*</code>), bagi (<code>/</code>), dan sisa bagi (<code>%</code>).</p>
<pre><code class="language-javascript">const a = 10;
const b = 3;
console.log(a + b); // 13
console.log(a % b); // 1 (sisa pembagian 10 oleh 3)
</code></pre>
<p>Hati-hati dengan operator <code>+</code> pada string karena ia berfungsi sebagai penggabung teks, bukan penjumlahan. Untuk menggabungkan variabel ke dalam kalimat, cara modernnya memakai template literal dengan backtick dan <code>${}</code>.</p>
<pre><code class="language-javascript">const namaDepan = "Dewi";
const kota = "Padang";
console.log(`Halo, saya ${namaDepan} dari ${kota}.`);
// Halo, saya Dewi dari Padang.
</code></pre>
<h2>Fungsi: Blok Kode yang Bisa Dipakai Ulang</h2>
<p>Fungsi adalah blok kode yang diberi nama dan bisa dipanggil berkali-kali. Tanpa fungsi, kamu akan menulis kode yang sama berulang-ulang. Ada dua cara penulisan yang umum: deklarasi fungsi biasa dan arrow function yang lebih ringkas.</p>
<pre><code class="language-javascript">// Deklarasi fungsi biasa
function sapa(nama) {
  return `Halo, ${nama}! Selamat belajar JavaScript.`;
}

console.log(sapa("Rina")); // Halo, Rina! Selamat belajar JavaScript.

// Arrow function (sintaks ES6)
const kuadrat = (angka) =&gt; {
  return angka * angka;
};

console.log(kuadrat(5)); // 25

// Arrow function satu baris bisa lebih ringkas lagi
const tambah = (x, y) =&gt; x + y;
console.log(tambah(4, 7)); // 11
</code></pre>
<p>Fungsi bisa menerima parameter (masukan) dan mengembalikan nilai lewat <code>return</code>. Parameter membuat fungsi menjadi fleksibel karena perilakunya bisa berubah tergantung argumen yang diberikan saat dipanggil. Biasakan memberi nilai default pada parameter bila masuk akal, supaya fungsi tetap berjalan walau pemanggil lupa memberi argumen.</p>
<pre><code class="language-javascript">function hitungDiskon(harga, persenDiskon = 10) {
  const potongan = harga * (persenDiskon / 100);
  return harga - potongan;
}

console.log(hitungDiskon(100000));     // 90000 (pakai default 10%)
console.log(hitungDiskon(100000, 25)); // 75000
</code></pre>
<h2>Array dan Object: Menyimpan Banyak Data Sekaligus</h2>
<p>Variabel biasa hanya menyimpan satu nilai. Untuk menyimpan banyak nilai, JavaScript menyediakan <code>array</code> (daftar berurutan) dan <code>object</code> (kumpulan pasangan kunci dan nilai).</p>
<p>Array memakai kurung siku dan indeksnya dimulai dari nol. Beberapa method array yang wajib hafal adalah <code>push</code> untuk menambah data, <code>length</code> untuk menghitung isi, dan <code>forEach</code> atau <code>map</code> untuk memproses setiap elemen.</p>
<pre><code class="language-javascript">const daftarBuah = ["apel", "<a href="https://ramzilhuda.com/manfaat-dan-khasiat-buah-mangga/">mangga</a>", "pisang"];

console.log(daftarBuah[0]);      // "apel" (indeks mulai dari 0)
console.log(daftarBuah.length);  // 3

daftarBuah.push("anggur");       // tambah di akhir
console.log(daftarBuah.length);  // 4

// forEach: menjalankan fungsi untuk tiap elemen
daftarBuah.forEach((buah) =&gt; {
  console.log(`Saya suka ${buah}`);
});
</code></pre>
<p>Object memakai kurung kurawal dan menyimpan data sebagai pasangan <code>kunci: nilai</code>. Ini struktur yang paling sering kamu temui saat berurusan dengan data dari API atau database.</p>
<pre><code class="language-javascript">const mahasiswa = {
  nama: "Fajar",
  nim: "2024001",
  jurusan: "Informatika",
  aktif: true
};

console.log(mahasiswa.nama);    // "Fajar" (dot notation)
console.log(mahasiswa["nim"]);  // "2024001" (bracket notation)

mahasiswa.semester = 5; // menambah properti baru
console.log(mahasiswa.semester); // 5
</code></pre>
<p>Kombinasi array berisi object adalah pola paling umum di dunia nyata, misalnya daftar mahasiswa yang masing-masing punya nama dan NIM. Kuasai pola ini baik-baik karena ia muncul di hampir setiap <a href="https://ramzilhuda.com/bagaimana-cara-melihata-whatasapp-kita-di-intai-orang-lain/">aplikasi</a>.</p>
<pre><code class="language-javascript">const daftarMahasiswa = [
  { nama: "Fajar", ipk: 3.5 },
  { nama: "Sinta", ipk: 3.8 },
  { nama: "Bimo", ipk: 3.2 }
];

daftarMahasiswa.forEach((mhs) =&gt; {
  console.log(`${mhs.nama} memiliki IPK ${mhs.ipk}`);
});
</code></pre>
<h2>Manipulasi DOM: Menghubungkan JavaScript dengan Halaman Web</h2>
<p>DOM (Document Object <a href="https://ramzilhuda.com/tujuan-mengevaluasi-model-artificial-neural-network-dengan-cross-validation/">Model</a>) adalah representasi halaman HTML sebagai struktur pohon yang bisa dibaca dan diubah oleh JavaScript. Inilah jembatan yang membuat halaman web menjadi interaktif. Tiga kemampuan DOM yang paling sering dipakai adalah mengambil elemen, mengubah isinya, dan merespons kejadian dari pengguna.</p>
<p>Untuk mengambil elemen, gunakan <code>document.getElementById</code> bila elemen punya atribut <code>id</code>, atau <code>document.querySelector</code> yang lebih fleksibel karena memakai sintaks selector CSS.</p>
<pre><code class="language-javascript">// &lt;p id="sapaan"&gt;Halo dunia&lt;/p&gt;
const paragraf = document.getElementById("sapaan");
paragraf.textContent = "Halo, JavaScript!"; // ubah isi teks

// querySelector memakai selector CSS
const tombol = document.querySelector(".btn-kirim");
tombol.style.backgroundColor = "orange"; // ubah gaya langsung
</code></pre>
<p>Interaksi sesungguhnya terjadi lewat event listener, yaitu fungsi yang dijalankan saat pengguna melakukan sesuatu seperti mengklik tombol. Polanya selalu sama: ambil elemen, pasang <code>addEventListener</code>, tulis fungsi yang dijalankan.</p>
<pre><code class="language-javascript">// &lt;button id="tombolKlik"&gt;Klik saya&lt;/button&gt;
// &lt;p id="hasil"&gt;&lt;/p&gt;

const tombolKlik = document.getElementById("tombolKlik");
const hasil = document.getElementById("hasil");

let jumlahKlik = 0;

tombolKlik.addEventListener("click", () =&gt; {
  jumlahKlik++;
  hasil.textContent = `Tombol diklik ${jumlahKlik} kali.`;
});
</code></pre>
<p>Selain <code>click</code>, ada banyak event lain seperti <code>input</code> (saat mengetik di form), <code>submit</code> (saat form dikirim), dan <code>mouseover</code>. Untuk mengubah tampilan, cara paling rapi adalah menambah atau menghapus class CSS lewat <code>classList</code>, bukan mengubah style satu per satu.</p>
<pre><code class="language-javascript">// &lt;div id="kotak" class="kotak-biru"&gt;&lt;/div&gt;
const kotak = document.getElementById("kotak");

kotak.classList.add("kotak-merah");    // tambah class
kotak.classList.remove("kotak-biru");  // hapus class
kotak.classList.toggle("aktif");       // alihkan: ada jadi hilang, hilang jadi ada
</code></pre>
<p>Method <code>toggle</code> pada contoh terakhir inilah yang akan menjadi bintang utama studi kasus kita berikutnya.</p>
<h2>Studi Kasus Tutorial JavaScript Pemula: Membuat Toggle Dark Mode</h2>
<p>Sekarang gabungkan semua yang sudah dipelajari menjadi satu program utuh: tombol yang mengalihkan halaman antara mode terang dan mode gelap. Buat satu file bernama <code>dark-mode.html</code>, lalu isi dengan kode berikut.</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang="id"&gt;
&lt;head&gt;
  &lt;meta charset="UTF-8"&gt;
  &lt;title&gt;Toggle Dark Mode&lt;/title&gt;
  &lt;style&gt;
    body {
      font-family: sans-serif;
      text-align: center;
      padding: 50px;
      transition: background-color 0.3s, color 0.3s;
    }
    body.dark {
      background-color: #1a1a2e;
      color: #f0f0f0;
    }
    button {
      padding: 12px 24px;
      font-size: 16px;
      cursor: pointer;
      border: none;
      border-radius: 8px;
      background-color: orange;
      color: white;
    }
  &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;h1 id="judul"&gt;Belajar JavaScript Itu Seru&lt;/h1&gt;
  &lt;p&gt;Klik tombol di bawah untuk mengganti tema halaman.&lt;/p&gt;
  &lt;button id="tombolTema"&gt;Aktifkan Dark Mode&lt;/button&gt;

  &lt;script&gt;
    const tombolTema = document.getElementById("tombolTema");
    const judul = document.getElementById("judul");

    tombolTema.addEventListener("click", () =&gt; {
      document.body.classList.toggle("dark");

      const modeGelapAktif = document.body.classList.contains("dark");

      if (modeGelapAktif) {
        tombolTema.textContent = "Aktifkan Light Mode";
        judul.textContent = "Mode Gelap Aktif";
      } else {
        tombolTema.textContent = "Aktifkan Dark Mode";
        judul.textContent = "Belajar JavaScript Itu Seru";
      }
    });
  &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>
<p>Mari bedah cara kerjanya baris per baris. Pertama, <code>const</code> dipakai untuk menyimpan referensi ke tombol dan judul karena referensi ini tidak pernah berubah. Kedua, <code>addEventListener("click", ...)</code> memasang fungsi yang berjalan setiap tombol diklik. Ketiga, <code>classList.toggle("dark")</code> menambah class <code>dark</code> ke body bila belum ada, atau menghapusnya bila sudah ada, sehingga CSS yang sudah disiapkan otomatis mengubah warna latar dan teks. Keempat, <code>classList.contains("dark")</code> memeriksa status saat ini supaya teks tombol dan judul ikut diperbarui dengan benar.</p>
<p>Coba simpan file itu lalu buka di browser dan klik tombolnya beberapa kali. Perhatikan bahwa seluruh <a href="https://ramzilhuda.com/logika-proposisi-matematika-diskrit/">logika</a> hanya belasan baris. Inilah kekuatan manipulasi DOM: sedikit kode, dampak langsung terlihat. Sebagai tantangan mandiri, coba simpan pilihan tema pengguna memakai <code>localStorage</code> supaya mode gelap tetap aktif walau halaman di-refresh.</p>
<h2>Kesalahan Umum yang Sering Dilakukan Pemula</h2>
<p>Setiap pemula JavaScript hampir pasti menabrak beberapa jebakan klasik. Mengetahui jebakan ini sejak awal menghemat waktu debugging yang lumayan.</p>
<p>Pertama, memakai <code>=</code> (assignment) padahal maksudnya <code>===</code> (perbandingan ketat) di dalam <code>if</code>. JavaScript juga punya <code>==</code> yang melakukan konversi tipe otomatis dan sering menimbulkan hasil mengejutkan, jadi biasakan selalu memakai <code>===</code>.</p>
<pre><code class="language-javascript">const umur = "20"; // string, bukan number!

if (umur == 20) {
  console.log("lolos dengan =="); // tercetak, karena konversi tipe
}

if (umur === 20) {
  console.log("tidak akan tercetak"); // string "20" tidak identik dengan number 20
}
</code></pre>
<p>Kedua, menjalankan kode DOM sebelum elemennya ada. Kalau tag <code>script</code> ditaruh di dalam <code>head</code> tanpa atribut khusus, kode berjalan sebelum body selesai dimuat sehingga <code>getElementById</code> mengembalikan <code>null</code>. Solusi paling mudah adalah menaruh <code>script</code> tepat sebelum penutup <code>&lt;/body&gt;</code>, seperti pada studi kasus di atas.</p>
<p>Ketiga, lupa bahwa indeks array dimulai dari nol. Mengakses <code>daftarBuah[3]</code> pada array berisi tiga elemen menghasilkan <code>undefined</code>, bukan error, sehingga bug-nya bisa lolos tanpa disadari.</p>
<p>Keempat, mengubah <code>const</code> secara langsung. Ingat, <code>const</code> melarang assignment ulang terhadap variabelnya, walau isi object-nya masih boleh diubah. Pesan errornya berbunyi &#8220;Assignment to constant variable&#8221; yang cukup jelas.</p>
<h2>Langkah Selanjutnya Setelah Tutorial Ini</h2>
<p>Selamat, kamu sekarang memegang fondasi JavaScript yang solid: variabel dengan <code>let</code> dan <code>const</code>, tipe data, fungsi termasuk arrow function, array dan object, sampai manipulasi DOM dengan event listener. Fondasi ini cukup untuk membuat halaman web interaktif sederhana dan menjadi modal wajib sebelum melangkah ke topik yang lebih besar.</p>
<p>Langkah logis berikutnya adalah mempelajari cara JavaScript berkomunikasi dengan server lewat HTTP request. Untuk itu, baca dulu penjelasan konsepnya di artikel <a href="https://ramzilhuda.com/apa-itu-api-penjelasan-untuk-pemula/">Apa Itu API? Penjelasan Sederhana Lengkap dengan Contoh untuk Pemula</a>, lalu praktikkan dengan <code>fetch</code> untuk mengambil data nyata. Setelah nyaman di sisi frontend, saatnya melirik sisi <a href="https://ramzilhuda.com/mengenal-server-peran-dan-tipe-server-yang-perlu-diketahui/">backend</a>: panduan <a href="https://ramzilhuda.com/tutorial-laravel-12-crud-pemula/">Tutorial Laravel 12: Membuat CRUD Sederhana dari Nol untuk Pemula</a> akan menunjukkan bagaimana data yang kamu olah di browser sebenarnya disimpan dan dikelola di server. Kombinasi JavaScript di frontend dan <a href="https://ramzilhuda.com/cara-membuat-project-sederhana-menggunakan-laravel-part-1/">Laravel</a> di backend adalah paket skill yang sangat dicari di dunia kerja pengembangan web saat ini.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramzilhuda.com/tutorial-javascript-untuk-pemula/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1390</post-id>	</item>
		<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>Cara Membuat REST API dengan Laravel: Panduan Lengkap untuk Pemula</title>
		<link>https://ramzilhuda.com/cara-membuat-rest-api-laravel/</link>
					<comments>https://ramzilhuda.com/cara-membuat-rest-api-laravel/#respond</comments>
		
		<dc:creator><![CDATA[ramzilhuda]]></dc:creator>
		<pubDate>Wed, 14 Oct 2026 09:31:34 +0000</pubDate>
				<category><![CDATA[Laravel]]></category>
		<category><![CDATA[api laravel pemula]]></category>
		<category><![CDATA[laravel sanctum]]></category>
		<category><![CDATA[rest api laravel]]></category>
		<category><![CDATA[tutorial laravel]]></category>
		<category><![CDATA[tutorial rest api]]></category>
		<guid isPermaLink="false">https://ramzilhuda.com/?p=1307</guid>

					<description><![CDATA[Setelah aplikasi webmu jadi, pertanyaan berikutnya hampir selalu sama: bagaimana kalau data yang sama perlu dipakai aplikasi mobile, atau ditampilkan di frontend modern seperti Vue dan React? Jawabannya adalah API. Artikel ini membahas cara membuat REST API dengan Laravel secara lengkap, mulai dari endpoint CRUD sampai autentikasi token memakai Laravel Sanctum. Tutorial ini melanjutkan seri [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Setelah <a href="https://ramzilhuda.com/bagaimana-cara-melihata-whatasapp-kita-di-intai-orang-lain/">aplikasi</a> webmu jadi, pertanyaan berikutnya hampir selalu sama: bagaimana kalau data yang sama perlu dipakai aplikasi <a href="https://ramzilhuda.com/tutorial-membuat-aplikasi-quiz-sederhana-menggunakan-android-studio/">mobile</a>, atau ditampilkan di frontend modern seperti Vue dan React? Jawabannya adalah API. Artikel ini membahas cara membuat REST API dengan <a href="https://ramzilhuda.com/cara-membuat-project-sederhana-menggunakan-laravel-part-1/">Laravel</a> secara lengkap, mulai dari endpoint CRUD sampai autentikasi token memakai Laravel Sanctum.</p>
<p>Tutorial ini melanjutkan seri Laravel di blog ini. Kita akan memakai contoh yang sama dengan tutorial sebelumnya, yaitu data produk dengan kolom name, description, price, dan stock. Bedanya, kali ini datanya tidak ditampilkan lewat Blade, melainkan disajikan sebagai data JSON yang bisa dikonsumsi aplikasi apa pun. Kalau kamu belum mengikuti tutorial CRUD sebelumnya, sangat disarankan menyelesaikannya dulu agar <a href="https://ramzilhuda.com/tujuan-mengevaluasi-model-artificial-neural-network-dengan-cross-validation/">model</a> dan tabel produknya sudah siap.</p>
<p><img data-recalc-dims="1" decoding="async" alt="Alur request REST API Laravel dari client ke database" src="https://i0.wp.com/ramzilhuda.com/wp-content/uploads/2026/10/media-generation-rest-api-laravel-diagram.webp?ssl=1" /></p>
<h2>Apa Itu REST API dan Kenapa Laravel Cocok untuk Itu</h2>
<p>REST API adalah cara standar dua aplikasi berkomunikasi lewat HTTP. Client mengirim request ke sebuah alamat (endpoint), lalu server membalas dengan data, biasanya dalam format JSON. Setiap operasi memakai method HTTP yang berbeda, dan pola ini berlaku konsisten di hampir semua API modern.</p>
<table>
<thead>
<tr>
<th>Method</th>
<th>Endpoint contoh</th>
<th>Fungsi</th>
</tr>
</thead>
<tbody>
<tr>
<td>GET</td>
<td>/api/products</td>
<td>Mengambil semua data produk</td>
</tr>
<tr>
<td>GET</td>
<td>/api/products/1</td>
<td>Mengambil satu produk berdasarkan ID</td>
</tr>
<tr>
<td>POST</td>
<td>/api/products</td>
<td>Menambah produk baru</td>
</tr>
<tr>
<td>PUT atau PATCH</td>
<td>/api/products/1</td>
<td>Mengubah produk berdasarkan ID</td>
</tr>
<tr>
<td>DELETE</td>
<td>/api/products/1</td>
<td>Menghapus produk berdasarkan ID</td>
</tr>
</tbody>
</table>
<p>Laravel cocok untuk membuat REST API karena tiga alasan. Pertama, routing dan resource controller-nya memang dirancang mengikuti pola REST. Kedua, Eloquent membuat urusan database menjadi singkat. Ketiga, ekosistemnya lengkap: ada Sanctum untuk autentikasi token, API Resource untuk mengatur format JSON, dan validasi bawaan yang rapi. Kamu tidak perlu memasang banyak paket tambahan hanya untuk membuat API yang layak pakai.</p>
<h2>Prasyarat Sebelum Mulai</h2>
<p>Pastikan hal berikut sudah siap di komputermu:</p>
<ol>
<li>Proyek Laravel 12 dari tutorial CRUD sebelumnya, dengan model Product dan tabel products yang sudah termigrasi.</li>
<li>Server lokal berjalan lewat perintah php artisan serve.</li>
<li>Aplikasi untuk menguji API, misalnya Postman, Insomnia, atau cukup terminal untuk perintah curl.</li>
</ol>
<p>Kalau proyek CRUD belum ada, kamu tetap bisa mengikuti tutorial ini dari proyek Laravel baru. Cukup buat model dan migration produk seperti pada tutorial sebelumnya, lalu lanjutkan dari langkah pertama di bawah.</p>
<h2>Langkah 1: Memasang Sanctum dengan Perintah install:api</h2>
<p>Di Laravel versi modern, dukungan API tidak aktif secara bawaan agar proyek web biasa tetap ringan. Untuk mengaktifkannya, jalankan satu perintah berikut di terminal proyekmu:</p>
<pre><code class="language-bash">php artisan install:api
</code></pre>
<p>Perintah ini melakukan beberapa hal sekaligus: memasang paket Laravel Sanctum, membuat file routes/api.php, dan menyiapkan migration untuk tabel personal_access_tokens yang nanti menyimpan token login pengguna. Setelah perintah selesai, jalankan migration:</p>
<pre><code class="language-bash">php artisan migrate
</code></pre>
<p>Semua route yang kamu tulis di routes/api.php otomatis memakai awalan /api. Jadi route products di file itu akan diakses sebagai /api/products. Inilah yang membedakannya dari route web di routes/web.php.</p>
<h2>Langkah 2: Membuat Controller Khusus API</h2>
<p>Jangan mencampur controller web dan controller API dalam satu file. Controller web mengembalikan tampilan Blade, sedangkan controller API mengembalikan JSON. Buat controller baru di dalam folder Api:</p>
<pre><code class="language-bash">php artisan make:controller Api/ProductController
</code></pre>
<p>Buka file app/Http/Controllers/Api/ProductController.php, lalu isi dengan kode berikut:</p>
<pre><code class="language-php">&lt;?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Http\Resources\ProductResource;
use App\Models\Product;
use Illuminate\Http\Request;

class ProductController extends Controller
{
    public function index()
    {
        return ProductResource::collection(Product::latest()-&gt;paginate(10));
    }

    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 = Product::create($validated);

        return (new ProductResource($product))
            -&gt;response()
            -&gt;setStatusCode(201);
    }

    public function show(Product $product)
    {
        return new ProductResource($product);
    }

    public function update(Request $request, Product $product)
    {
        $validated = $request-&gt;validate([
            'name' =&gt; 'sometimes|string|max:255',
            'description' =&gt; 'nullable|string',
            'price' =&gt; 'sometimes|numeric|min:0',
            'stock' =&gt; 'sometimes|integer|min:0',
        ]);

        $product-&gt;update($validated);

        return new ProductResource($product);
    }

    public function destroy(Product $product)
    {
        $product-&gt;delete();

        return response()-&gt;json(['message' =&gt; 'Produk berhasil dihapus.']);
    }
}
</code></pre>
<p>Ada tiga hal yang perlu diperhatikan dari kode di atas. Pertama, validasi tetap dilakukan di setiap operasi tulis, sama seperti CRUD versi web. Kedua, pada method update kita memakai aturan sometimes agar client boleh mengubah sebagian kolom saja, sesuai sifat method PATCH. Ketiga, method show dan update memakai route model binding: Laravel otomatis mencari produk berdasarkan ID di URL, dan otomatis membalas 404 bila ID tidak ditemukan. Kamu tidak perlu menulis pencarian manual.</p>
<p>Sebagai pengembangan lanjutan, validasi di controller ini nantinya bisa dipisah ke Form Request agar controller lebih ramping. Untuk tahap dasar, validasi langsung seperti ini sudah cukup dan lebih mudah diikuti.</p>
<h2>Langkah 3: Mengatur Format JSON dengan API Resource</h2>
<p>Kalau model langsung dikembalikan sebagai JSON, semua kolom di tabel akan ikut tampil, termasuk yang seharusnya tidak perlu diketahui client. API Resource memberi kamu kendali penuh atas kolom apa saja yang dikirim. Buat resource-nya:</p>
<pre><code class="language-bash">php artisan make:resource ProductResource
</code></pre>
<p>Lalu buka app/Http/Resources/ProductResource.php dan ubah method toArray menjadi:</p>
<pre><code class="language-php">public function toArray(Request $request): array
{
    return [
        'id' =&gt; $this-&gt;id,
        'name' =&gt; $this-&gt;name,
        'description' =&gt; $this-&gt;description,
        'price' =&gt; (int) $this-&gt;price,
        'stock' =&gt; (int) $this-&gt;stock,
        'created_at' =&gt; $this-&gt;created_at?-&gt;toDateTimeString(),
        'updated_at' =&gt; $this-&gt;updated_at?-&gt;toDateTimeString(),
    ];
}
</code></pre>
<p>Jangan lupa menambahkan use Illuminate\Http\Request; di bagian atas file bila belum ada. Dengan resource ini, format balasan akan konsisten di semua endpoint: data produk dibungkus dalam kunci data, dan untuk daftar produk Laravel otomatis menambahkan informasi pagination seperti total halaman. Konsistensi format seperti ini yang membuat API nyaman dipakai tim frontend.</p>
<h2>Langkah 4: Mendaftarkan Route API</h2>
<p>Sekarang daftarkan endpoint-nya di routes/api.php:</p>
<pre><code class="language-php">&lt;?php

use App\Http\Controllers\Api\ProductController;
use Illuminate\Support\Facades\Route;

Route::apiResource('products', ProductController::class);
</code></pre>
<p>Satu baris apiResource itu menghasilkan lima endpoint sekaligus sesuai tabel di awal artikel. Untuk memastikan semuanya terdaftar dengan benar, jalankan:</p>
<pre><code class="language-bash">php artisan route:list --path=api
</code></pre>
<p>Kamu akan melihat daftar route beserta method HTTP dan controller tujuannya. Bila daftar ini sudah muncul, API dasarmu sebenarnya sudah jadi dan siap diuji.</p>
<h2>Langkah 5: Menguji API dengan curl</h2>
<p>Pastikan server berjalan, lalu buka terminal baru dan coba beberapa perintah berikut.</p>
<p>Mengambil semua produk:</p>
<pre><code class="language-bash">curl http://127.0.0.1:8000/api/products
</code></pre>
<p>Menambah produk baru:</p>
<pre><code class="language-bash">curl -X POST http://127.0.0.1:8000/api/products -H &quot;Content-Type: application/json&quot; -H &quot;Accept: application/json&quot; -d '{&quot;name&quot;:&quot;Keyboard Mechanical&quot;,&quot;description&quot;:&quot;Keyboard RGB hot swap&quot;,&quot;price&quot;:350000,&quot;stock&quot;:12}'
</code></pre>
<p>Balasan yang benar untuk penambahan data adalah status 201 Created beserta data produk yang baru dibuat, lengkap dengan ID-nya. Kalau kamu mendapat status 422, berarti validasi gagal dan pesan errornya ada di dalam JSON balasan. Baca pesan itu baik baik, karena di situlah petunjuk kolom mana yang bermasalah.</p>
<p>Di Postman, langkahnya setara: pilih method POST, masukkan URL yang sama, buka tab Body, pilih raw dan JSON, lalu tempel isi data produknya. Jangan lupa selalu mengirim header Accept: application/json agar Laravel membalas error dalam format JSON, bukan halaman HTML.</p>
<h2>Langkah 6: Menambahkan Autentikasi Token dengan Sanctum</h2>
<p>API yang terbuka untuk siapa pun cocok untuk data publik, tetapi operasi tambah, ubah, dan hapus data sebaiknya hanya boleh dilakukan pengguna yang sudah login. Sanctum menyelesaikan ini dengan token: pengguna login sekali, menerima token, lalu mengirim token itu di setiap request berikutnya.</p>
<p>Pertama, aktifkan trait HasApiTokens pada model User. Buka app/Models/User.php dan sesuaikan bagian atas class:</p>
<pre><code class="language-php">use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;
    // ...
}
</code></pre>
<p>Kedua, buat controller autentikasi:</p>
<pre><code class="language-bash">php artisan make:controller Api/AuthController
</code></pre>
<p>Isi file app/Http/Controllers/Api/AuthController.php dengan kode berikut:</p>
<pre><code class="language-php">&lt;?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\ValidationException;

class AuthController extends Controller
{
    public function register(Request $request)
    {
        $validated = $request-&gt;validate([
            'name' =&gt; 'required|string|max:255',
            'email' =&gt; 'required|string|email|unique:users',
            'password' =&gt; 'required|string|min:8|confirmed',
        ]);

        $user = User::create([
            'name' =&gt; $validated['name'],
            'email' =&gt; $validated['email'],
            'password' =&gt; Hash::make($validated['password']),
        ]);

        return response()-&gt;json([
            'user' =&gt; $user,
            'token' =&gt; $user-&gt;createToken('api-token')-&gt;plainTextToken,
        ], 201);
    }

    public function login(Request $request)
    {
        $request-&gt;validate([
            'email' =&gt; 'required|string|email',
            'password' =&gt; 'required|string',
        ]);

        $user = User::where('email', $request-&gt;email)-&gt;first();

        if (! $user || ! Hash::check($request-&gt;password, $user-&gt;password)) {
            throw ValidationException::withMessages([
                'email' =&gt; ['Email atau password salah.'],
            ]);
        }

        return response()-&gt;json([
            'user' =&gt; $user,
            'token' =&gt; $user-&gt;createToken('api-token')-&gt;plainTextToken,
        ]);
    }

    public function logout(Request $request)
    {
        $request-&gt;user()-&gt;currentAccessToken()-&gt;delete();

        return response()-&gt;json(['message' =&gt; 'Berhasil logout.']);
    }
}
</code></pre>
<p>Ketiga, perbarui routes/api.php agar endpoint produk terlindungi, sedangkan register dan login tetap terbuka:</p>
<pre><code class="language-php">&lt;?php

use App\Http\Controllers\Api\AuthController;
use App\Http\Controllers\Api\ProductController;
use Illuminate\Support\Facades\Route;

Route::post('/register', [AuthController::class, 'register']);
Route::post('/login', [AuthController::class, 'login']);

Route::middleware('auth:sanctum')-&gt;group(function () {
    Route::apiResource('products', ProductController::class);
    Route::post('/logout', [AuthController::class, 'logout']);
});
</code></pre>
<p>Pola ini umum dipakai: membaca data pun bisa kamu longgarkan bila memang datanya publik, misalnya memindahkan method index dan show ke luar grup middleware. Untuk latihan ini, semua endpoint produk kita lindungi agar perilaku tokennya terlihat jelas.</p>
<h2>Langkah 7: Menguji Endpoint yang Terlindungi</h2>
<p>Coba akses /api/products tanpa token. Laravel akan membalas status 401 Unauthorized. Itu tanda perlindungannya bekerja.</p>
<p>Selanjutnya login untuk mendapatkan token:</p>
<pre><code class="language-bash">curl -X POST http://127.0.0.1:8000/api/login -H &quot;Content-Type: application/json&quot; -H &quot;Accept: application/json&quot; -d '{&quot;email&quot;:&quot;contoh@mail.com&quot;,&quot;password&quot;:&quot;password123&quot;}'
</code></pre>
<p>Salin nilai token dari balasan, lalu pakai pada request berikutnya lewat header Authorization:</p>
<pre><code class="language-bash">curl http://127.0.0.1:8000/api/products -H &quot;Accept: application/json&quot; -H &quot;Authorization: Bearer TOKEN_KAMU&quot;
</code></pre>
<p>Kali ini data produk akan tampil. Di Postman, token yang sama bisa diisi pada tab Authorization dengan tipe Bearer Token. Simpan token ini baik baik dan jangan pernah menaruhnya di kode frontend yang dipublikasikan, karena siapa pun yang memiliki token itu bisa bertindak atas nama pengguna pemiliknya.</p>
<h2>Troubleshooting yang Sering Terjadi</h2>
<p><strong>Route /api tidak ditemukan (404).</strong> Biasanya karena install:api belum dijalankan atau file routes/api.php belum terdaftar. Jalankan php artisan route:list &#8211;path=api untuk memastikan, dan bersihkan cache route dengan php artisan route:clear bila perlu.</p>
<p><strong>Balasan error berupa halaman HTML, bukan JSON.</strong> Client tidak mengirim header Accept: application/json. Tambahkan header itu di curl atau Postman, terutama saat menguji validasi dan autentikasi.</p>
<p><strong>Status 401 padahal sudah login.</strong> Periksa tiga hal: token disalin utuh tanpa spasi tambahan, header diawali kata Bearer diikuti satu spasi, dan route memang berada di dalam grup auth:sanctum. Kesalahan paling sering adalah token tertukar dengan token dari sesi login lama yang sudah dihapus.</p>
<p><strong>Class HasApiTokens tidak ditemukan.</strong> Artinya Sanctum belum terpasang. Jalankan kembali php artisan install:api, atau pasang manual dengan composer require laravel/sanctum lalu php artisan vendor:publish untuk konfigurasinya.</p>
<p><strong>Error kolom tidak boleh diisi (mass assignment).</strong> Sama seperti tutorial CRUD: pastikan semua kolom produk sudah terdaftar di properti fillable pada model Product.</p>
<h2>FAQ REST API Laravel</h2>
<p><strong>1. Apa bedanya Route::apiResource dan Route::resource?</strong><br />
apiResource hanya membuat lima route untuk operasi data (index, store, show, update, destroy), sedangkan resource menambahkan route create dan edit yang dipakai untuk menampilkan form HTML. Karena API tidak punya form, apiResource adalah pilihan yang tepat.</p>
<p><strong>2. Apakah REST API Laravel harus selalu memakai Sanctum?</strong><br />
Tidak selalu. API publik yang hanya menampilkan data terbuka bisa dibuat tanpa autentikasi. Sanctum dipakai bila ada data milik pengguna atau operasi tulis yang perlu dibatasi. Untuk komunikasi antar server yang lebih kompleks, ada juga Laravel Passport berbasis OAuth2, tetapi untuk kebanyakan aplikasi pemula Sanctum jauh lebih sederhana.</p>
<p><strong>3. Bagaimana cara membatasi jumlah data per halaman?</strong><br />
Pada contoh ini kita memakai paginate(10), dan client bisa berpindah halaman dengan menambahkan ?page=2 pada URL. Jumlah per halaman boleh diubah sesuai kebutuhan, dan lazimnya disertakan juga pilihan per_page dari query string bila API dipakai banyak client.</p>
<p><strong>4. Bisakah API ini dipakai aplikasi <a href="https://ramzilhuda.com/tutorial-pengenalan-framework-flutter/">Flutter</a> atau React Native?</strong><br />
Bisa, dan memang untuk itulah API ini dibuat. Aplikasi mobile cukup mengirim request HTTP ke endpoint yang sama dan membaca balasan JSON-nya. Yang perlu diperhatikan, alamat 127.0.0.1 hanya berlaku di komputer pengembang. Untuk pengujian dari HP, gunakan alamat IP lokal komputer atau layanan tunnel selama pengembangan.</p>
<p><strong>5. Bagaimana cara membuat versi API, misalnya v1 dan v2?</strong><br />
Kelompokkan route ke dalam awalan versi, contohnya Route::prefix(&#8216;v1&#8217;) pada grup route, sehingga URL menjadi /api/v1/products. Dengan cara ini, perubahan besar di masa depan bisa diterbitkan sebagai v2 tanpa merusak aplikasi lama yang masih memakai v1.</p>
<h2>Kesimpulan</h2>
<p>Kamu baru saja mengubah aplikasi CRUD Laravel menjadi REST API yang utuh: endpoint produk dengan format JSON yang konsisten lewat API Resource, validasi di setiap operasi tulis, pagination, dan autentikasi token memakai Sanctum. Pola ini adalah fondasi hampir semua <a href="https://ramzilhuda.com/mengenal-server-peran-dan-tipe-server-yang-perlu-diketahui/">backend</a> modern, baik untuk aplikasi mobile, frontend JavaScript, maupun <a href="https://ramzilhuda.com/metode-numerik-integrasi-numerik/">integrasi</a> antar layanan.</p>
<p>Langkah alami berikutnya adalah menerapkan pola yang sama ke data lain di aplikasimu, lalu mempelajari cara men-deploy API ini ke server agar bisa diakses dari mana saja. Sebagai penguat dasar, baca kembali seri awalnya di <a href="https://ramzilhuda.com/tutorial-laravel-12-crud-pemula/">Tutorial Laravel 12: Membuat CRUD Sederhana dari Nol untuk Pemula</a> dan padukan dengan bantuan <a href="https://ramzilhuda.com/ai-membantu-penemuan-obat-chatbot-dan-pencarian-yang-revolusioner/">AI</a> secara etis lewat panduan <a href="https://ramzilhuda.com/tools-ai-gratis-untuk-mahasiswa/">5 Tools AI Gratis untuk Mahasiswa</a> yang juga sudah terbit di blog ini.</p>
<p><em>Sudah berhasil membuat endpoint pertamamu? Ceritakan di kolom komentar method mana yang paling membingungkan, nanti kita bahas bersama.</em></p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramzilhuda.com/cara-membuat-rest-api-laravel/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1307</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>
		<item>
		<title>Tiket.com Blackpink: Panduan Lengkap untuk Membeli Tiket Konser BLACKPINK di Jakarta 2025</title>
		<link>https://ramzilhuda.com/tiket-com-blackpink-panduan-lengkap-untuk-membeli-tiket-konser-blackpink-di-jakarta-2025/</link>
					<comments>https://ramzilhuda.com/tiket-com-blackpink-panduan-lengkap-untuk-membeli-tiket-konser-blackpink-di-jakarta-2025/#respond</comments>
		
		<dc:creator><![CDATA[ramzilhuda]]></dc:creator>
		<pubDate>Thu, 12 Jun 2025 16:49:10 +0000</pubDate>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Blackpink]]></category>
		<guid isPermaLink="false">https://ramzilhuda.com/?p=1250</guid>

					<description><![CDATA[Bagi para BLINK, kabar gembira datang pada Kamis, 12 Juni 2025! Tiket konser BLACKPINK WORLD TOUR IN JAKARTA resmi dijual ke publik mulai pukul 10.00 WIB. Bagi yang sudah menunggu-nunggu kesempatan ini, Tiket.com menjadi platform resmi tempat penjualan tiket tanpa memerlukan keanggotaan khusus. Jangan lewatkan momen luar biasa untuk menyaksikan penampilan grup musik fenomenal ini [&#8230;]]]></description>
										<content:encoded><![CDATA[<p data-start="112" data-end="693">Bagi para <em data-start="122" data-end="129">BLINK</em>, kabar gembira datang pada Kamis, 12 Juni 2025! Tiket konser <em data-start="191" data-end="224">BLACKPINK WORLD TOUR IN <a href="https://ramzilhuda.com/gaji-umr-pekerja-di-jakarta-2022-naik-327/">JAKARTA</a></em> resmi dijual ke publik mulai pukul 10.00 WIB. Bagi yang sudah menunggu-nunggu kesempatan ini, <em data-start="319" data-end="330">Tiket.com</em> menjadi <a href="https://ramzilhuda.com/ide-bisnis-yang-bisa-anda-pertimbangkan-di-bidang-platform-syariah/">platform</a> resmi tempat penjualan tiket tanpa memerlukan keanggotaan khusus. Jangan lewatkan momen luar biasa untuk menyaksikan penampilan grup musik fenomenal ini di Jakarta. Artikel ini akan memberikan panduan lengkap cara membeli tiket <em data-start="576" data-end="587">BLACKPINK</em> di <em data-start="591" data-end="602">Tiket.com</em> serta informasi terkait harga tiket dan langkah-langkah pembelian yang perlu Anda ketahui.</p>
<p data-start="112" data-end="693"><img data-recalc-dims="1" fetchpriority="high" decoding="async" class="aligncenter size-full wp-image-1252" src="https://i0.wp.com/ramzilhuda.com/wp-content/uploads/2025/06/Black-Pink-Show-2025.jpg?resize=811%2C550&#038;ssl=1" alt="" width="811" height="550" srcset="https://i0.wp.com/ramzilhuda.com/wp-content/uploads/2025/06/Black-Pink-Show-2025.jpg?w=811&amp;ssl=1 811w, https://i0.wp.com/ramzilhuda.com/wp-content/uploads/2025/06/Black-Pink-Show-2025.jpg?resize=300%2C203&amp;ssl=1 300w, https://i0.wp.com/ramzilhuda.com/wp-content/uploads/2025/06/Black-Pink-Show-2025.jpg?resize=768%2C521&amp;ssl=1 768w" sizes="(max-width: 811px) 100vw, 811px" /></p>
<p data-start="695" data-end="755"><strong data-start="695" data-end="755">Mengapa Memilih Tiket.com untuk Membeli Tiket BLACKPINK?</strong></p>
<p data-start="757" data-end="969"><em data-start="757" data-end="769">Tikets.com</em> selalu menjadi platform pilihan utama bagi para penggemar yang ingin membeli tiket konser. Ada beberapa alasan mengapa <a href="http://Tiket.com"><em data-start="889" data-end="900">Tiket.com</em></a> menjadi mitra resmi penjualan tiket konser <em data-start="944" data-end="955">BLACKPINK</em>, antara lain:</p>
<ol data-start="971" data-end="1793">
<li data-start="971" data-end="1302">
<p data-start="974" data-end="1302"><strong data-start="974" data-end="1015">Proses Pembelian yang Mudah dan Cepat</strong><br data-start="1015" data-end="1018" />Dengan antarmuka yang mudah digunakan, Tiket.com memungkinkan Anda untuk membeli tiket dengan beberapa langkah sederhana. Bahkan pada saat penjualan tiket besar seperti konser <em data-start="1197" data-end="1208">BLACKPINK</em>, sistem di Tiket.com sudah disiapkan untuk menangani lonjakan trafik pengguna dengan efisien.</p>
</li>
<li data-start="1304" data-end="1552">
<p data-start="1307" data-end="1552"><strong data-start="1307" data-end="1335">Keamanan dan Kepercayaan</strong><br data-start="1335" data-end="1338" />Tiket.com dikenal dengan sistem pembayaran yang aman dan terpercaya. Anda dapat melakukan pembayaran menggunakan berbagai <a href="https://ramzilhuda.com/metode-numerik-metode-newton-raphson/">metode</a>, seperti kartu kredit, transfer bank, hingga e-wallet, yang mempermudah transaksi.</p>
</li>
<li data-start="1554" data-end="1793">
<p data-start="1557" data-end="1793"><strong data-start="1557" data-end="1591">Akses Langsung ke General Sale</strong><br data-start="1591" data-end="1594" />Tiket konser <em data-start="1610" data-end="1621">BLACKPINK</em> dapat dibeli melalui <em data-start="1643" data-end="1657">general sale</em> di <em data-start="1661" data-end="1672">Tiket.com</em>, yang terbuka untuk publik tanpa keanggotaan khusus. Ini memberikan kesempatan bagi semua penggemar untuk membeli tiket.</p>
</li>
</ol>
<p data-start="1795" data-end="1840"><strong data-start="1795" data-end="1840">Harga Tiket Konser BLACKPINK 2025 Jakarta</strong></p>
<p data-start="1842" data-end="2078">Tiket untuk konser <em data-start="1861" data-end="1894">BLACKPINK WORLD TOUR IN JAKARTA</em> dijual dengan berbagai kategori, dengan harga yang bervariasi sesuai dengan lokasi tempat duduk dan paket yang dipilih. Berikut adalah daftar harga tiket konser yang dapat Anda pilih:</p>
<ul data-start="2080" data-end="2417">
<li data-start="2080" data-end="2130">
<p data-start="2082" data-end="2130"><strong data-start="2082" data-end="2114">Blink PIT Package (standing)</strong>: Rp 3.800.000</p>
</li>
<li data-start="2131" data-end="2176">
<p data-start="2133" data-end="2176"><strong data-start="2133" data-end="2160">Blink Package (seating)</strong>: Rp 3.800.000</p>
</li>
<li data-start="2177" data-end="2217">
<p data-start="2179" data-end="2217"><strong data-start="2179" data-end="2201">Platinum (seating)</strong>: Rp 3.400.000</p>
</li>
<li data-start="2218" data-end="2255">
<p data-start="2220" data-end="2255"><strong data-start="2220" data-end="2239">Cat 1 (seating)</strong>: Rp 3.100.000</p>
</li>
<li data-start="2256" data-end="2293">
<p data-start="2258" data-end="2293"><strong data-start="2258" data-end="2277">Cat 2 (seating)</strong>: Rp 2.600.000</p>
</li>
<li data-start="2294" data-end="2331">
<p data-start="2296" data-end="2331"><strong data-start="2296" data-end="2315">Cat 3 (seating)</strong>: Rp 2.300.000</p>
</li>
<li data-start="2332" data-end="2369">
<p data-start="2334" data-end="2369"><strong data-start="2334" data-end="2353">Cat 4 (seating)</strong>: Rp 2.000.000</p>
</li>
<li data-start="2370" data-end="2417">
<p data-start="2372" data-end="2417"><strong data-start="2372" data-end="2401">Restricted View (seating)</strong>: Rp 1.450.000</p>
</li>
</ul>
<p data-start="2419" data-end="2592">Harap dicatat bahwa harga yang tercantum belum termasuk pajak dan biaya administrasi. Pastikan untuk memeriksa harga final saat melakukan pembayaran di platform <em data-start="2580" data-end="2591">Tiket.com</em>.</p>
<p data-start="2594" data-end="2639"><strong data-start="2594" data-end="2639">Cara Membeli Tiket BLACKPINK di Tiket.com</strong></p>
<p data-start="2641" data-end="2752">Berikut adalah langkah-langkah mudah untuk membeli tiket <em data-start="2698" data-end="2731">BLACKPINK WORLD TOUR IN JAKARTA</em> melalui <em data-start="2740" data-end="2751">Tiket.com</em>:</p>
<ol data-start="2754" data-end="4671">
<li data-start="2754" data-end="3163">
<p data-start="2757" data-end="3163"><strong data-start="2757" data-end="2798">Unduh dan Masuk ke <a href="https://ramzilhuda.com/bagaimana-cara-melihata-whatasapp-kita-di-intai-orang-lain/">Aplikasi</a> Tiket.com</strong><br data-start="2798" data-end="2801" />Jika Anda belum memiliki aplikasi <a href="http://Tiket.com"><em data-start="2838" data-end="2849">Tiket.com</em></a>, unduh terlebih dahulu melalui <a class="cursor-pointer" target="_new" rel="noopener" data-start="2881" data-end="2977">Google Play Store</a> atau <a class="" href="https://apps.apple.com/id/app/tiket-com/id546329753" target="_new" rel="noopener" data-start="2983" data-end="3053">Apple App Store</a>. Jika sudah, masuk ke akun <em data-start="3081" data-end="3092">Tiket.com</em> Anda. Jika belum memiliki akun, Anda dapat membuatnya terlebih dahulu.</p>
</li>
<li data-start="3165" data-end="3426">
<p data-start="3168" data-end="3426"><strong data-start="3168" data-end="3193">Cari Konser BLACKPINK</strong><br data-start="3193" data-end="3196" />Setelah berhasil login, buka aplikasi dan klik ikon &#8220;Event&#8221; di halaman utama. Di bagian ini, Anda akan menemukan berbagai acara, termasuk konser <em data-start="3344" data-end="3377">BLACKPINK WORLD TOUR IN JAKARTA</em>. Pilih banner konser tersebut untuk melanjutkan.</p>
</li>
<li data-start="3428" data-end="3698">
<p data-start="3431" data-end="3698"><strong data-start="3431" data-end="3467">Masuk ke Sistem Antrean Otomatis</strong><br data-start="3467" data-end="3470" />Pada pukul 10.00 WIB tanggal 12 Juni 2025, saat penjualan tiket dibuka, Anda akan diarahkan ke sistem antrean otomatis atau <em data-start="3597" data-end="3611">waiting room</em>. Pastikan Anda sudah siap di waktu yang tepat untuk menghindari kehilangan kesempatan.</p>
</li>
<li data-start="3700" data-end="3958">
<p data-start="3703" data-end="3958"><strong data-start="3703" data-end="3741">Pilih Tiket dan Tentukan Jumlahnya</strong><br data-start="3741" data-end="3744" />Setelah masuk ke antrean, pilih kategori tiket yang Anda inginkan, serta jumlah tiket yang ingin Anda beli (maksimal enam tiket per akun per hari). Pastikan Anda memilih tiket yang sesuai dengan preferensi Anda.</p>
</li>
<li data-start="3960" data-end="4172">
<p data-start="3963" data-end="4172"><strong data-start="3963" data-end="3990">Lengkapi Data Pemesanan</strong><br data-start="3990" data-end="3993" />Setelah memilih tiket, Anda akan diminta untuk melengkapi data pribadi seperti nama dan alamat email. Pastikan data yang dimasukkan benar agar proses transaksi berjalan lancar.</p>
</li>
<li data-start="4174" data-end="4421">
<p data-start="4177" data-end="4421"><strong data-start="4177" data-end="4229">Pilih Metode Pembayaran dan Selesaikan Transaksi</strong><br data-start="4229" data-end="4232" />Pilih metode pembayaran yang tersedia, seperti kartu kredit, transfer bank, atau e-wallet. Setelah memilih metode pembayaran, lanjutkan dengan transaksi dan tunggu konfirmasi pembayaran.</p>
</li>
<li data-start="4423" data-end="4671">
<p data-start="4426" data-end="4671"><strong data-start="4426" data-end="4454">Tiket Anda Akan Tersedia</strong><br data-start="4454" data-end="4457" />Setelah pembayaran berhasil, tiket elektronik (e-ticket) akan tersedia di halaman &#8220;Your Orders&#8221; pada aplikasi atau situs web <a href="http://Tiket.com"><em data-start="4585" data-end="4596">Tiket.com</em></a> Anda. Pastikan untuk menyimpan e-ticket ini sebagai bukti masuk ke konser.</p>
</li>
</ol>
<p data-start="4673" data-end="4712"><strong data-start="4673" data-end="4712">Tips Menghadapi War Tiket BLACKPINK</strong></p>
<p data-start="4714" data-end="4891">Saat membeli tiket konser <em data-start="4740" data-end="4751">BLACKPINK</em>, Anda mungkin akan mengalami &#8220;war tiket&#8221; atau persaingan ketat karena tingginya permintaan. Berikut beberapa tips yang dapat membantu Anda:</p>
<ul data-start="4893" data-end="5496">
<li data-start="4893" data-end="5089">
<p data-start="4895" data-end="5089"><strong data-start="4895" data-end="4925">Siapkan Akun dan Data Diri</strong><br data-start="4925" data-end="4928" />Pastikan akun <em data-start="4945" data-end="4956">Tiket.com</em> Anda sudah terdaftar dan data diri lengkap sebelum penjualan tiket dimulai. Ini akan menghemat waktu Anda pada saat antrean dimulai.</p>
</li>
<li data-start="5091" data-end="5295">
<p data-start="5093" data-end="5295"><strong data-start="5093" data-end="5134">Buka Aplikasi Sebelum Waktu Penjualan</strong><br data-start="5134" data-end="5137" />Pastikan Anda sudah membuka aplikasi <em data-start="5177" data-end="5188">Tiket.com</em> dan siap di sistem antrean sebelum penjualan dimulai pada pukul 10.00 WIB. Jangan menunggu menit terakhir!</p>
</li>
<li data-start="5297" data-end="5496">
<p data-start="5299" data-end="5496"><strong data-start="5299" data-end="5328">Siapkan Metode Pembayaran</strong><br data-start="5328" data-end="5331" />Untuk menghindari keterlambatan, pastikan metode pembayaran Anda sudah terdaftar dan siap digunakan. Pilih metode yang paling cepat untuk menyelesaikan transaksi.</p>
</li>
</ul>
<p data-start="5498" data-end="5555"><strong data-start="5498" data-end="5555">Kehadiran BLACKPINK di Jakarta: Momen yang Dinantikan</strong></p>
<p data-start="5557" data-end="5932">Konser <em data-start="5564" data-end="5575">BLACKPINK</em> di Jakarta 2025 diperkirakan akan menjadi salah satu acara terbesar tahun ini. <em data-start="5655" data-end="5666">BLACKPINK</em>—yang terdiri dari Jisoo, Jennie, Rosé, dan Lisa—dikenal dengan aksi panggung yang spektakuler, visual yang memukau, dan energi yang luar biasa. Kehadiran mereka di Jakarta pastinya akan membawa pengalaman konser yang tak terlupakan bagi para penggemar di Indonesia.</p>
<p data-start="5934" data-end="6172">Dengan basis penggemar yang besar di seluruh dunia, konser ini akan menjadi momen bersejarah bagi para <em data-start="6037" data-end="6044">BLINK</em> di Indonesia. Bagi yang sudah membeli tiket, pastikan Anda menyiapkan diri untuk menikmati penampilan luar biasa dari grup ini.</p>
<p data-start="6174" data-end="6188"><strong data-start="6174" data-end="6188">Kesimpulan</strong></p>
<p data-start="6190" data-end="6574">Penjualan tiket <em data-start="6206" data-end="6239">BLACKPINK WORLD TOUR IN JAKARTA</em> 2025 sudah dimulai, dan <em data-start="6264" data-end="6275">Tiket.com</em> adalah platform resmi tempat Anda bisa mendapatkan tiket konser mereka. Dengan mengikuti langkah-langkah yang sudah dijelaskan di atas, Anda bisa mendapatkan tiket dengan mudah dan cepat. Ingat, persiapkan diri Anda sebelum waktu penjualan dimulai pada pukul 10.00 WIB agar tidak ketinggalan tiket.</p>
<p data-start="6576" data-end="6796" data-is-last-node="" data-is-only-node="">Jangan lewatkan kesempatan langka ini untuk menyaksikan aksi panggung <em data-start="6646" data-end="6657">BLACKPINK</em> secara langsung! Buka aplikasi <a href="http://Tiket.com"><em data-start="6689" data-end="6700">Tiket.com</em></a> Anda sekarang, dan pastikan Anda mendapatkan tiket untuk pengalaman konser yang tak terlupakan.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramzilhuda.com/tiket-com-blackpink-panduan-lengkap-untuk-membeli-tiket-konser-blackpink-di-jakarta-2025/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1250</post-id>	</item>
		<item>
		<title>Sample Dataset pada Scikit-Learn &#124; Belajar Machine Learning Dasar</title>
		<link>https://ramzilhuda.com/sample-dataset-pada-scikit-learn-belajar-machine-learning-dasar/</link>
					<comments>https://ramzilhuda.com/sample-dataset-pada-scikit-learn-belajar-machine-learning-dasar/#respond</comments>
		
		<dc:creator><![CDATA[ramzilhuda]]></dc:creator>
		<pubDate>Wed, 03 Jan 2024 08:17:51 +0000</pubDate>
				<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[google colab]]></category>
		<category><![CDATA[machine learning]]></category>
		<category><![CDATA[sample data]]></category>
		<category><![CDATA[sckit-learn]]></category>
		<guid isPermaLink="false">https://ramzilhuda.com/?p=1023</guid>

					<description><![CDATA[Sample Dataset pada Scikit-Learn Adapun yang harus kita persiapkan dalam pembelajaran sample dataset pada scikit-learn adalah : Memiliki akun Gmail, kemudian login ke dalam akun Gmail. Buka google colab untuk menjalankan script dari scikit-learn. Buat project baru Untuk kasus kali ini kita memakai iris dataset, ketikan kedalam script kode script berikut Penjelasan dari script di atas [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>Sample Dataset pada Scikit-Learn</h1>
<p>Adapun yang harus kita persiapkan dalam pembelajaran sample dataset pada scikit-learn adalah :</p>
<ul>
<li>Memiliki akun Gmail, kemudian login ke dalam akun Gmail.</li>
<li>Buka <a href="https://colab.research.google.com/?hl=id">google colab</a> untuk menjalankan script dari scikit-learn.</li>
<li>Buat project baru</li>
</ul>
<p><img data-recalc-dims="1" decoding="async" class="aligncenter size-medium wp-image-1024" src="https://i0.wp.com/ramzilhuda.com/wp-content/uploads/2022/09/buat-projek-baru-machine-learning.png?resize=300%2C185&#038;ssl=1" alt="buat projek baru machine learning" width="300" height="185" srcset="https://i0.wp.com/ramzilhuda.com/wp-content/uploads/2022/09/buat-projek-baru-machine-learning.png?resize=300%2C185&amp;ssl=1 300w, https://i0.wp.com/ramzilhuda.com/wp-content/uploads/2022/09/buat-projek-baru-machine-learning.png?w=468&amp;ssl=1 468w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<ul>
<li>Untuk kasus kali ini kita memakai iris dataset, ketikan kedalam script kode script berikut</li>
</ul>

<pre class="wp-block-code" style="font-size: 14px;"><code class="language-python line-numbers" lang="python">from sklearn.datasets import load_iris
iris = load_iris()
iris</code></pre>



<p class="wp-block-paragraph">Penjelasan dari script di atas adalah pertama kita harus install dulu sklearn.datasets kemudian kita import function load_iris. untuk memanggil iris dataset dengan load_iris() kemudian kita tampung dalam satu variabel dengan nama iris, kemudian untuk menampilkan kita ketik variabel iris.</p>



<p class="wp-block-paragraph">Untuk menjalankan program tersebut cukup dengan mengklik tombol play pada menu di samping program. hasilnya seperti gambar di bawah ini :</p>



<figure class="wp-block-image size-full"><img data-recalc-dims="1" decoding="async" width="747" height="500" class="wp-image-1030" src="https://i0.wp.com/ramzilhuda.com/wp-content/uploads/2022/09/running-load-iris.png?resize=747%2C500&#038;ssl=1" alt="" srcset="https://i0.wp.com/ramzilhuda.com/wp-content/uploads/2022/09/running-load-iris.png?w=747&amp;ssl=1 747w, https://i0.wp.com/ramzilhuda.com/wp-content/uploads/2022/09/running-load-iris.png?resize=300%2C201&amp;ssl=1 300w" sizes="(max-width: 747px) 100vw, 747px" /></figure>



<p class="wp-block-paragraph">Kita akan mendata keys apa saja yang dimiliki oleh iris dataset, dengan mengetikan kode pada baris baru:</p>



<pre class="wp-block-code"><code class="">iris.keys()</code></pre>



<p class="wp-block-paragraph">kemudian jalankan, maka hasilnya seperti gambar di bawah ini :</p>



<figure class="wp-block-image size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" class="wp-image-1034" src="https://i0.wp.com/ramzilhuda.com/wp-content/uploads/2022/09/iris-keys-1.png?resize=719%2C347&#038;ssl=1" alt="" width="719" height="347" srcset="https://i0.wp.com/ramzilhuda.com/wp-content/uploads/2022/09/iris-keys-1.png?w=766&amp;ssl=1 766w, https://i0.wp.com/ramzilhuda.com/wp-content/uploads/2022/09/iris-keys-1.png?resize=300%2C145&amp;ssl=1 300w" sizes="auto, (max-width: 719px) 100vw, 719px" /></figure>



<p class="wp-block-paragraph">Adapun Keys() yang tersedia dari iris dataset adalah : &#8216;data&#8217;, &#8216;target&#8217;, &#8216;frame&#8217;, &#8216;target_names&#8217;, &#8216;DESCR&#8217;, &#8216;feature_names&#8217;, &#8216;filename&#8217;, &#8216;data_module&#8217;.</p>



<p class="wp-block-paragraph">Untuk data keys akan berkaitan dengan data features, sedangkan target berkaitan nanti dengan data &#8211; data target. Frame untuk menanandakan apakah data format yang ada pada iris dataset data frame atau bukan data frame. Target_names dan Features names akan berkolerasi dengan nama atau label untuk setiap target dan featuresnya. DESCR merupakan kependekan dari deskripsi . filename akan berkolerasi dengan lokasi filename projek ini dan yang terakhir data_module adalah modul yang diakses pada sklearn yaitu sklearn.datasets.data.</p>



<h2 class="wp-block-heading">Deskripsi Dari Sample Dataset</h2>



<p class="wp-block-paragraph">Sample dataset yang kita gunakan dapat teman &#8211; teman gali infromasinya melalui link <a href="https://en.wikipedia.org/wiki/Iris_flower_data_set">wikipedia</a>. untuk mengakses metadata dari iris dataset adalah dengan cara mengetikan script di bawah ini :</p>



<pre class="wp-block-code"><code class="">print(iris.DESCR)</code></pre>



<p class="wp-block-paragraph">hasilnya dapat kita lihat di bawah ini</p>



<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="755" height="558" class="wp-image-1038" src="https://i0.wp.com/ramzilhuda.com/wp-content/uploads/2022/09/iris-deskrpsi.png?resize=755%2C558&#038;ssl=1" alt="" srcset="https://i0.wp.com/ramzilhuda.com/wp-content/uploads/2022/09/iris-deskrpsi.png?w=755&amp;ssl=1 755w, https://i0.wp.com/ramzilhuda.com/wp-content/uploads/2022/09/iris-deskrpsi.png?resize=300%2C222&amp;ssl=1 300w" sizes="auto, (max-width: 755px) 100vw, 755px" /></figure>



<p class="wp-block-paragraph">Dari gambar di atas dapat kita ambil informasi tentang judul dataset, dengan judul Iris plants dataset, number of instances jumlah baris 150 baris terdapat 3 class ( Iris-Setosa, Iris-Versicolour, Iris-Virginica ) di dalam1 class terdapat 50 baris. Number of attributes ada 4 atributes : sepal lenght, sepal width, petal length dan petal widht dengan format ukuran centimeter ( cm ).</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramzilhuda.com/sample-dataset-pada-scikit-learn-belajar-machine-learning-dasar/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1023</post-id>	</item>
	</channel>
</rss>
