<?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/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:27:02 +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>Cara Membuat NPWP Online 2026: Syarat dan Langkah Lengkap</title>
		<link>https://ramzilhuda.com/cara-membuat-npwp-online-2026/</link>
					<comments>https://ramzilhuda.com/cara-membuat-npwp-online-2026/#respond</comments>
		
		<dc:creator><![CDATA[ramzilhuda]]></dc:creator>
		<pubDate>Thu, 12 Nov 2026 02:00:23 +0000</pubDate>
				<category><![CDATA[Panduan]]></category>
		<category><![CDATA[aktivasi nik npwp]]></category>
		<category><![CDATA[cara membuat npwp]]></category>
		<category><![CDATA[coretax djp]]></category>
		<category><![CDATA[npwp 2026]]></category>
		<category><![CDATA[npwp online]]></category>
		<guid isPermaLink="false">https://ramzilhuda.com/?p=1438</guid>

					<description><![CDATA[Nomor Pokok Wajib Pajak (NPWP) kini bisa dibuat sepenuhnya dari HP tanpa antre di kantor pajak. Namun ada satu hal penting yang wajib kamu tahu sebelum mulai: cara membuat NPWP online 2026 tidak lagi lewat situs lama ereg.pajak.go.id. Sejak 1 Januari 2025, seluruh pendaftaran wajib pajak baru dilakukan melalui sistem Coretax DJP di coretaxdjp.pajak.go.id. Artikel [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Nomor Pokok Wajib Pajak (NPWP) kini bisa dibuat sepenuhnya dari HP tanpa antre di kantor pajak. Namun ada satu hal penting yang wajib kamu tahu sebelum mulai: cara membuat NPWP online 2026 tidak lagi lewat situs lama ereg.pajak.go.id. Sejak 1 Januari 2025, seluruh pendaftaran wajib pajak baru dilakukan melalui sistem Coretax DJP di coretaxdjp.pajak.go.id.</p>
<p>Artikel ini menjelaskan syarat dokumen, langkah pendaftaran NPWP online 2026 via Coretax langkah demi langkah, <a href="https://ramzilhuda.com/ide-bisnis-yang-bisa-anda-pertimbangkan-di-bidang-platform-syariah/">konsep</a> NIK yang kini berfungsi sebagai NPWP, sampai apa yang harus dilakukan setelah kartu elektronik terbit. Panduan ini untuk wajib pajak orang pribadi WNI, yang merupakan kasus paling umum.</p>
<p><img data-recalc-dims="1" decoding="async" alt="Langkah daftar NPWP online via Coretax" src="https://i0.wp.com/ramzilhuda.com/wp-content/uploads/2026/10/batch3-21-isi.webp?ssl=1" /></p>
<h2>Kenapa Daftar NPWP Sekarang Lewat Coretax</h2>
<p>Coretax adalah sistem inti administrasi perpajakan milik Direktorat Jenderal Pajak yang beroperasi penuh sejak 1 Januari 2025, berdasarkan PMK Nomor 81 Tahun 2024. Sistem ini menggantikan ereg.pajak.go.id dan DJP Online, serta menyatukan <a href="https://ramzilhuda.com/mengenal-server-peran-dan-tipe-server-yang-perlu-diketahui/">layanan</a> daftar NPWP, lapor SPT, dan bayar pajak dalam satu portal.</p>
<p>Perubahan terbesarnya adalah <a href="https://ramzilhuda.com/metode-numerik-integrasi-numerik/">integrasi</a> NIK sebagai NPWP. Sejak 1 Juli 2024, NIK pada KTP otomatis berfungsi sebagai NPWP 16 digit. Artinya, bagi WNI yang NIK-nya valid di Dukcapil, proses &#8220;membuat NPWP&#8221; pada praktiknya adalah mengaktivasi NIK agar berfungsi penuh sebagai identitas perpajakan di Coretax. NPWP lama berformat 15 digit masih berlaku selama masa transisi, tetapi seluruh layanan kini berjalan di atas Coretax.</p>
<p>Satu kabar baik: seluruh proses pendaftaran NPWP online gratis. DJP menegaskan tidak ada biaya apa pun, dan masyarakat diminta waspada terhadap pihak yang meminta bayaran dengan janji mempercepat penerbitan NPWP.</p>
<h2>Syarat Dokumen Membuat NPWP Online</h2>
<p>Sebelum membuka portal Coretax, siapkan dulu dokumen dan data berikut agar proses tidak terhenti di tengah jalan.</p>
<ol>
<li><strong>e-KTP yang masih berlaku.</strong> NIK di dalamnya adalah kunci utama karena akan diaktivasi sebagai NPWP.</li>
<li><strong>Kartu Keluarga (KK) terbaru.</strong> Data KK dipakai untuk melengkapi formulir pendaftaran.</li>
<li><strong>Alamat email aktif.</strong> Dipakai untuk verifikasi dan menerima kartu NPWP elektronik.</li>
<li><strong>Nomor HP aktif.</strong> Dipakai untuk menerima kode OTP via SMS.</li>
<li><strong>Perangkat dengan kamera.</strong> Untuk swafoto yang akan dicocokkan dengan data Dukcapil.</li>
<li><strong>Data pekerjaan dan sumber penghasilan.</strong> Misalnya karyawan, pekerja bebas, atau usahawan.</li>
</ol>
<p>Satu hal yang sering membuat pendaftaran gagal: data KTP dan KK tidak sinkron dengan database Dukcapil. Jika alamat berbeda, nama tidak persis sama, atau status perkawinan belum diperbarui, validasi otomatis akan menolak. Pastikan data kependudukanmu sudah benar sebelum mendaftar, perbaiki dulu ke Disdukcapil bila ada yang tidak sesuai.</p>
<h2>Langkah-Langkah Cara Membuat NPWP Online 2026 via Coretax</h2>
<p>Berikut alur pendaftaran untuk wajib pajak orang pribadi di portal Coretax.</p>
<ol>
<li>Buka <strong>coretaxdjp.pajak.go.id</strong> di browser HP atau laptop.</li>
<li>Klik menu <strong>Daftar di Sini</strong> untuk memulai pendaftaran baru.</li>
<li>Pilih jenis wajib pajak <strong>Perorangan</strong>.</li>
<li>Saat ditanya kepemilikan NIK, pilih <strong>Ya</strong>, lalu pilih opsi <strong>Aktivasi NIK</strong> agar NIK langsung berfungsi sebagai NPWP 16 digit.</li>
<li>Isi formulir data diri: nama lengkap, tempat dan tanggal lahir, status perkawinan, pekerjaan, dan Klasifikasi Lapangan Usaha (KLU) sesuai pekerjaanmu.</li>
<li>Isi alamat wajib pajak: alamat domisili, alamat korespondensi, dan alamat sesuai KTP. Jika domisili sama dengan KTP, gunakan opsi salin alamat.</li>
<li>Masukkan <strong>email aktif</strong> dan <strong>nomor HP aktif</strong>, lalu verifikasi keduanya dengan <strong>kode OTP</strong> yang dikirim sistem.</li>
<li>Lakukan <strong>swafoto</strong> dengan pencahayaan cukup dan wajah menghadap kamera. Sistem mencocokkan fotomu dengan database Dukcapil.</li>
<li>Baca kembali seluruh data, centang pernyataan bahwa data sudah benar, lalu klik <strong>Kirim Pengajuan</strong> atau <strong>Submit Application</strong>.</li>
<li>Tunggu notifikasi berhasil dan cek email yang kamu daftarkan.</li>
</ol>
<p>Setelah pengajuan terkirim, kartu NPWP elektronik dalam format PDF beserta petunjuk login akun Coretax biasanya dikirim ke email dalam 1 sampai 3 hari kerja. Simpan baik-baik file PDF tersebut karena berfungsi sebagai kartu NPWP digital resmi.</p>
<h2>Perbedaan Coretax dan eReg Pajak</h2>
<p>Banyak yang masih bingung membedakan dua sistem ini karena namanya mirip. Tabel berikut merangkum perbedaannya agar kamu tidak salah alamat.</p>
<table>
<thead>
<tr>
<th>Aspek</th>
<th>Coretax DJP (baru)</th>
<th>eReg Pajak (lama)</th>
</tr>
</thead>
<tbody>
<tr>
<td>Status 2026</td>
<td>Aktif, satu-satunya jalur resmi</td>
<td>Tidak aktif untuk pendaftaran baru</td>
</tr>
<tr>
<td>Alamat</td>
<td>coretaxdjp.pajak.go.id</td>
<td>ereg.pajak.go.id</td>
</tr>
<tr>
<td>Format NPWP</td>
<td>NIK 16 digit</td>
<td>NPWP 15 digit terpisah</td>
</tr>
<tr>
<td>Verifikasi identitas</td>
<td>Otomatis via Dukcapil (OTP + swafoto)</td>
<td>Manual oleh petugas KPP</td>
</tr>
<tr>
<td>Waktu proses</td>
<td>Bisa 1 sampai 3 hari kerja</td>
<td>Dulu 1 sampai 14 hari kerja</td>
</tr>
<tr>
<td>Layanan lain</td>
<td>Lapor SPT, bayar pajak, faktur</td>
<td>Hanya pendaftaran NPWP</td>
</tr>
</tbody>
</table>
<p>Intinya: jika kamu menemukan tutorial lama yang mengarahkan ke ereg.pajak.go.id, abaikan dan pakai Coretax. Sistem lama sudah tidak memproses pendaftaran baru sejak 1 Januari 2025.</p>
<h2>Wajib Pajak Perorangan vs Badan: Mana yang Kamu Butuhkan</h2>
<p>Panduan ini fokus pada wajib pajak orang pribadi, yaitu individu seperti karyawan, freelancer, dan pemilik usaha perorangan. Untuk kategori ini, aktivasi NIK sudah cukup dan prosesnya paling sederhana.</p>
<p>Jika kamu mendaftarkan badan usaha (PT, CV, yayasan), dokumennya lebih banyak: akta pendirian perusahaan, NPWP penanggung jawab (direktur atau komisaris), KTP penanggung jawab, surat keterangan domisili usaha, dan dokumen izin usaha seperti NIB. Alurnya tetap lewat Coretax dengan memilih jenis wajib pajak badan, tetapi verifikasi dokumennya lebih ketat. Untuk kebutuhan pribadi seperti melamar kerja atau membuka rekening, kategori perorangan adalah pilihan yang benar.</p>
<h2>Masalah Umum Saat Daftar dan Solusinya</h2>
<p>Empat kendala paling sering muncul saat pendaftaran NPWP online beserta cara mengatasinya.</p>
<p>Pertama, OTP tidak kunjung datang. Tunggu beberapa menit karena antrean SMS kadang padat, pastikan nomor HP aktif dan punya pulsa atau sinyal yang baik, lalu minta kirim ulang kode. Kedua, data ditolak karena tidak cocok dengan Dukcapil. Ini tanda ada perbedaan antara KTP/KK dan database kependudukan; perbaiki dulu ke Disdukcapil, jangan memaksa mengulang dengan data yang sama.</p>
<p>Ketiga, swafoto gagal terverifikasi berulang kali. Coba di ruangan terang, lepaskan masker dan kacamata hitam, dan pastikan wajah memenuhi bingkai kamera. Keempat, email konfirmasi tidak masuk. Periksa folder spam atau promosi, pastikan alamat email diketik benar, dan tunggu hingga 3 hari kerja sebelum menghubungi KPP.</p>
<h2>Setelah NPWP Terbit: Yang Perlu Kamu Lakukan</h2>
<p>NPWP yang sudah aktif membuka akses ke seluruh layanan Coretax dengan akun yang sama. Kamu bisa melaporkan SPT Tahunan, membayar pajak, dan mengurus administrasi perpajakan lain tanpa membuat akun terpisah. Simpan kredensial login Coretax di tempat aman dan jangan dibagikan ke siapa pun.</p>
<p>Bagi karyawan, serahkan nomor NPWP ke bagian HRD atau keuangan perusahaan agar pemotongan PPh 21 berjalan dengan tarif normal. Tanpa NPWP yang terdaftar, pemotongan pajak atas penghasilan bisa dikenakan tarif lebih tinggi. Bagi pelaku usaha, NPWP adalah syarat dasar mengurus perizinan lanjutan; misalnya pengajuan <a href="/kur-bri-2026-syarat-tabel-angsuran/">KUR BRI 2026</a> untuk modal usaha mensyaratkan dokumen identitas perpajakan yang valid.</p>
<p>Perlu diingat juga kewajiban setelah memiliki NPWP: melaporkan SPT Tahunan setiap tahun meski penghasilanmu belum kena pajak. Kewajiban ini berlaku sejak NPWP diterbitkan, jadi catat tenggatnya agar tidak terkena <a href="https://ramzilhuda.com/meta-didenda-13-miliar-atas-transfer-data-ke-as/">denda</a> keterlambatan lapor.</p>
<h2>Kapan Kamu Wajib Punya NPWP</h2>
<p>Secara umum, NPWP wajib dimiliki oleh setiap orang pribadi yang sudah memenuhi syarat subjektif dan objektif sebagai wajib pajak, misalnya sudah berpenghasilan di atas batas Penghasilan Tidak Kena Pajak (PTKP) atau menjalankan usaha. Namun dalam praktiknya, NPWP juga dibutuhkan jauh sebelum itu: melamar pekerjaan formal, membuka rekening tertentu, mengajukan kredit bank, mengurus paspor untuk keperluan tertentu, sampai mengikuti lelang pemerintah.</p>
<p>Bagi mahasiswa tingkat akhir, memiliki NPWP sejak dini adalah langkah antisipatif yang cerdas. Prosesnya gratis dan kini bisa selesai dari HP, jadi tidak ada alasan menundanya sampai terdesak kebutuhan. Simpan nomor NPWP dan file kartu elektroniknya di tempat yang mudah ditemukan, misalnya di folder dokumen penting di HP, karena nomor ini akan ditanyakan berulang kali sepanjang kariermu.</p>
<h2>FAQ Cara Membuat NPWP Online 2026</h2>
<p><strong>1. Apakah ereg.pajak.go.id masih bisa dipakai untuk daftar NPWP?</strong><br />
Tidak. Sejak Coretax beroperasi penuh pada 1 Januari 2025, situs ereg.pajak.go.id sudah tidak aktif untuk pendaftaran wajib pajak baru. Satu-satunya jalur resmi adalah coretaxdjp.pajak.go.id.</p>
<p><strong>2. Saya sudah punya NIK, apakah masih perlu daftar NPWP?</strong><br />
NIK memang sudah terintegrasi sebagai NPWP 16 digit, tetapi kamu tetap perlu melakukan aktivasi NIK lewat Coretax agar bisa memakai layanan perpajakan seperti lapor SPT. Tanpa aktivasi, NIK-mu belum terdaftar sebagai wajib pajak aktif di sistem.</p>
<p><strong>3. Berapa biaya membuat NPWP online?</strong><br />
Gratis, tidak dipungut biaya apa pun. Jika ada pihak yang meminta bayaran untuk membuatkan NPWP, itu bukan jalur resmi dan patut dicurigai sebagai penipuan.</p>
<p><strong>4. Berapa lama NPWP terbit setelah daftar?</strong><br />
Kartu NPWP elektronik (PDF) umumnya dikirim ke email dalam 1 sampai 3 hari kerja setelah data tervalidasi. Jika melebihi itu, periksa folder spam email atau hubungi KPP terdekat.</p>
<p><strong>5. Bagaimana jika verifikasi wajah (swafoto) selalu gagal?</strong><br />
Pastikan pencahayaan cukup, wajah tidak tertutup masker atau kacamata hitam, dan foto tidak blur. Jika tetap gagal, kemungkinan data foto di Dukcapil sudah lama; kamu bisa memperbarui data biometrik ke Disdukcapil setempat lalu mencoba lagi.</p>
<p><strong>6. Saya sudah punya NPWP lama, apakah perlu daftar ulang di Coretax?</strong><br />
Tidak perlu mendaftar ulang. Data NPWP lama sudah termigrasi ke sistem Coretax. Yang perlu kamu lakukan adalah membuat akun Coretax dan melakukan aktivasi memakai NIK serta data NPWP lamamu, agar bisa mengakses seluruh layanan perpajakan digital. Setelah aktivasi berhasil, nomor identitas perpajakanmu mengikuti format 16 digit berbasis NIK.</p>
<h2>Kesimpulan</h2>
<p>Cara membuat NPWP online 2026 intinya hanya tiga tahap besar: buka coretaxdjp.pajak.go.id dan pilih Aktivasi NIK, lengkapi data diri lalu verifikasi lewat OTP dan swafoto, kemudian tunggu kartu elektronik dikirim ke email. Siapkan e-KTP, KK, email, dan nomor HP aktif sebelumnya, dan pastikan datamu sinkron dengan Dukcapil agar validasi berjalan mulus.</p>
<p>NPWP adalah pintu masuk ke banyak urusan resmi, dari urusan pajak tahunan sampai pengajuan pembiayaan usaha. Kalau kamu berencana memakai NPWP untuk mengembangkan usaha, baca juga panduan <a href="/kur-bri-2026-syarat-tabel-angsuran/">KUR BRI 2026: syarat, tabel angsuran, dan cara pengajuan untuk UMKM</a> yang sudah terjadwal terbit di blog ini.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramzilhuda.com/cara-membuat-npwp-online-2026/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1438</post-id>	</item>
		<item>
		<title>Cara Cek Penerima PIP 2026 Lewat HP: Panduan Resmi Kemendikbud</title>
		<link>https://ramzilhuda.com/cara-cek-penerima-pip-2026/</link>
					<comments>https://ramzilhuda.com/cara-cek-penerima-pip-2026/#respond</comments>
		
		<dc:creator><![CDATA[ramzilhuda]]></dc:creator>
		<pubDate>Wed, 11 Nov 2026 02:00:16 +0000</pubDate>
				<category><![CDATA[Panduan]]></category>
		<category><![CDATA[cara cek pip]]></category>
		<category><![CDATA[cek nisn pip]]></category>
		<category><![CDATA[penerima pip]]></category>
		<category><![CDATA[pip 2026]]></category>
		<category><![CDATA[program indonesia pintar]]></category>
		<guid isPermaLink="false">https://ramzilhuda.com/?p=1426</guid>

					<description><![CDATA[Program Indonesia Pintar (PIP) 2026 kembali disalurkan kepada jutaan siswa di seluruh Indonesia. Kalau kamu atau anakmu merasa berhak menerima bantuan ini tetapi belum tahu statusnya, cara cek penerima PIP 2026 lewat HP adalah langkah pertama yang paling mudah. Cukup siapkan NISN dan NIK, buka situs resmi, dan hasilnya muncul dalam hitungan detik. Artikel ini [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Program Indonesia Pintar (PIP) 2026 kembali disalurkan kepada jutaan siswa di seluruh Indonesia. Kalau kamu atau anakmu merasa berhak menerima bantuan ini tetapi belum tahu statusnya, cara cek penerima PIP 2026 lewat HP adalah langkah pertama yang paling mudah. Cukup siapkan NISN dan NIK, buka situs resmi, dan hasilnya muncul dalam hitungan detik.</p>
<p>Artikel ini memandu kamu mengecek status penerima PIP 2026 dari HP langkah demi langkah, menjelaskan arti setiap status yang muncul, merinci jadwal pencairan tiga termin tahun 2026, besaran bantuan per jenjang, sampai cara aktivasi rekening bagi penerima baru. Semua langkah mengacu pada portal resmi Kementerian Pendidikan Dasar dan Menengah (Kemendikdasmen).</p>
<p><img data-recalc-dims="1" decoding="async" alt="Langkah cek penerima PIP lewat HP" src="https://i0.wp.com/ramzilhuda.com/wp-content/uploads/2026/10/batch3-20-isi.webp?ssl=1" /></p>
<h2>Apa Itu Program Indonesia Pintar (PIP)</h2>
<p>PIP adalah bantuan tunai pendidikan dari pemerintah untuk peserta didik dari keluarga kurang mampu. Tujuannya sederhana: memastikan anak usia sekolah tetap bisa belajar tanpa terkendala biaya. Penerima PIP umumnya berasal dari keluarga pemegang Kartu Indonesia Pintar (KIP), peserta Program Keluarga Harapan (PKH), yatim piatu, atau siswa yang diusulkan sekolah dan dinas pendidikan karena kondisi ekonominya.</p>
<p>Dana PIP disalurkan langsung ke rekening siswa penerima melalui bank penyalur, bukan lewat perantara. Karena penyaluran dilakukan bertahap dalam tiga termin sepanjang tahun, status tiap siswa bisa berbeda-beda. Inilah alasan kenapa mengecek status secara mandiri itu penting: kamu tidak perlu menunggu kabar dari sekolah untuk tahu apakah dana sudah masuk atau belum.</p>
<p>Perlu dicatat, sejak penataan kementerian, urusan pendidikan dasar dan menengah kini berada di bawah Kemendikdasmen, sehingga portal resmi PIP beralamat di pip.kemendikdasmen.go.id. Jika kamu menemukan tautan lama berdomain kemendikbud, pastikan tujuan akhirnya adalah situs resmi yang sama.</p>
<h2>Syarat Umum Penerima PIP 2026</h2>
<p>Sebelum mengecek, pastikan kamu memahami siapa saja yang berhak menerima PIP. Kriteria umumnya adalah peserta didik jenjang SD, SMP, SMA/SMK, atau pendidikan kesetaraan (Paket A/B/C) yang berasal dari keluarga miskin atau rentan miskin. Indikator yang dipakai antara lain kepemilikan KIP, terdaftar sebagai penerima PKH atau bansos lain, berstatus yatim/piatu/yatim piatu, atau diusulkan oleh sekolah berdasarkan pertimbangan khusus.</p>
<p>Data siswa diambil dari Data Pokok Pendidikan (Dapodik) yang diisi oleh sekolah. Artinya, jika data di Dapodik belum lengkap atau belum diperbarui, status penerima bisa belum muncul meski siswa sebenarnya memenuhi syarat. Kalau kamu yakin memenuhi syarat tetapi namamu tidak ditemukan, langkah yang benar adalah konfirmasi ke pihak sekolah atau dinas pendidikan setempat, bukan mengulang pengecekan berkali-kali.</p>
<h2>Cara Cek Penerima PIP 2026 Lewat HP</h2>
<p>Pengecekan dilakukan di portal resmi dan bisa dikerjakan sepenuhnya dari HP. Siapkan dua data ini sebelum mulai: NISN (Nomor Induk Siswa Nasional, 10 digit) dan NIK (Nomor Induk Kependudukan siswa, 16 digit). Keduanya biasanya tercantum di rapor, kartu pelajar, atau Kartu Keluarga.</p>
<ol>
<li>Buka browser di HP (Chrome, Safari, atau browser lain), lalu kunjungi <strong>pip.kemendikdasmen.go.id</strong>.</li>
<li>Gulir halaman sampai menemukan bagian <strong>Cari Penerima PIP</strong>.</li>
<li>Masukkan <strong>NISN</strong> siswa pada kolom yang tersedia.</li>
<li>Masukkan <strong>NIK</strong> siswa sesuai data kependudukan.</li>
<li>Selesaikan verifikasi keamanan dengan menjawab soal perhitungan matematika sederhana atau mengisi kode captcha yang muncul di layar.</li>
<li>Klik tombol <strong>Cek Penerima PIP</strong>, lalu tunggu beberapa detik.</li>
<li>Baca hasil yang ditampilkan sistem.</li>
</ol>
<p>Jika siswa tercatat sebagai penerima, sistem menampilkan nama, sekolah, wilayah, bank penyalur, dan status pencairan dana. Jika tidak tercatat, akan muncul keterangan bahwa siswa belum berstatus sebagai penerima pada pengecekan tersebut.</p>
<p>Tips agar pengecekan berhasil: pastikan NISN dan NIK diketik tanpa spasi dan sesuai persis dengan data di Kartu Keluarga. Kesalahan satu digit saja membuat data tidak ditemukan. Jika NISN tidak hafal, kamu bisa mencarinya dulu di situs referensi data Kemendikdasmen dengan kata kunci nama, tempat lahir, dan nama ibu kandung.</p>
<h2>Memahami Arti Status Hasil Pengecekan</h2>
<p>Hasil pengecekan tidak selalu berarti dana sudah cair. Berikut arti status yang umum muncul agar kamu tidak salah tafsir.</p>
<table>
<thead>
<tr>
<th>Status yang muncul</th>
<th>Arti</th>
</tr>
</thead>
<tbody>
<tr>
<td>Dana sudah masuk (disertai tanggal)</td>
<td>Bantuan sudah cair ke rekening penyaluran PIP siswa</td>
</tr>
<tr>
<td>Penerima terdaftar, belum ada keterangan dana masuk</td>
<td>Siswa terdaftar, tetapi pencairan masih menunggu termin berikutnya atau proses aktivasi rekening</td>
</tr>
<tr>
<td>Memiliki SK Pemberian tetapi belum aktivasi</td>
<td>Siswa wajib melakukan aktivasi rekening ke bank penyalur sebelum dana bisa dicairkan</td>
</tr>
<tr>
<td>Tidak ditemukan sebagai penerima</td>
<td>Data belum tercatat sebagai penerima pada termin ini; bisa karena belum tervalidasi atau memang belum masuk kuota</td>
</tr>
</tbody>
</table>
<p>Status &#8220;belum ada keterangan dana masuk&#8221; bukan berarti gagal. Pencairan PIP 2026 dilakukan bertahap hingga Desember, jadi penerima termin akhir memang baru menerima di penghujung tahun. Selama namamu tercatat sebagai penerima, dana akan disalurkan sesuai jadwal terminnya.</p>
<h2>Jadwal Pencairan PIP 2026: Tiga Termin</h2>
<p>Penyaluran dana PIP 2026 dibagi ke dalam tiga termin sepanjang tahun. Berikut jadwalnya berdasarkan informasi penyaluran resmi.</p>
<table>
<thead>
<tr>
<th>Termin</th>
<th>Periode</th>
<th>Sasaran utama</th>
</tr>
</thead>
<tbody>
<tr>
<td>Termin 1</td>
<td>Februari sampai April 2026</td>
<td>Pemegang KIP dengan data tervalidasi, prioritas kelas akhir</td>
</tr>
<tr>
<td>Termin 2</td>
<td>Mei sampai September 2026</td>
<td>Penerima reguler dan usulan dinas pendidikan</td>
</tr>
<tr>
<td>Termin 3</td>
<td>Oktober sampai Desember 2026</td>
<td>Siswa yang belum menerima pada termin sebelumnya, usulan susulan, dan hasil aktivasi SK nominasi</td>
</tr>
</tbody>
</table>
<p>Karena artikel ini tayang pada November 2026, pencairan yang sedang berjalan adalah termin ketiga. Jika statusmu menunjukkan penerima tetapi dana belum masuk, kemungkinan besar penyaluranmu dijadwalkan pada termin ini. Jadwal termin dapat berubah mengikuti kebijakan pemerintah, jadi pengecekan berkala tetap disarankan.</p>
<h2>Besaran Bantuan PIP 2026 per Jenjang</h2>
<p>Nominal bantuan berbeda menurut jenjang pendidikan dan disalurkan per semester. Berikut rinciannya.</p>
<table>
<thead>
<tr>
<th>Jenjang</th>
<th>Per semester</th>
<th>Per tahun</th>
</tr>
</thead>
<tbody>
<tr>
<td>TK</td>
<td>Rp225.000</td>
<td>Rp450.000</td>
</tr>
<tr>
<td>SD/SDLB/Paket A</td>
<td>Rp225.000</td>
<td>Rp450.000</td>
</tr>
<tr>
<td>SMP/SMPLB/Paket B</td>
<td>Rp375.000</td>
<td>Rp750.000</td>
</tr>
<tr>
<td>SMA/SMK/SMALB/Paket C</td>
<td>Rp900.000</td>
<td>Rp1.800.000</td>
</tr>
</tbody>
</table>
<p>Catatan penting: siswa baru atau siswa kelas akhir pada jenjang SD dan SMP menerima setengah dari nominal tahunan (Rp225.000 untuk SD, Rp375.000 untuk SMP), begitu juga siswa kelas akhir SMA/SMK yang menerima Rp900.000. Mulai tahun 2026, peserta didik TK juga mulai menerima bantuan PIP sebesar Rp450.000 per tahun. Dana ini khusus untuk kebutuhan pendidikan seperti buku, seragam, dan perlengkapan sekolah.</p>
<h2>Bank Penyalur dan Cara Aktivasi Rekening</h2>
<p>Dana PIP disalurkan melalui bank penyalur resmi: BRI untuk jenjang SD dan SMP, BNI untuk SMA dan SMK, serta BSI yang melayani seluruh jenjang. Rekening yang dipakai adalah rekening SimPel (Simpanan Pelajar) atas nama siswa.</p>
<p>Bagi penerima baru yang belum memiliki rekening aktif, wajib melakukan aktivasi terlebih dahulu. Caranya: datangi bank penyalur terdekat dengan membawa Surat Keputusan (SK) pemberian PIP atau surat keterangan dari sekolah, Kartu Keluarga, dan KTP orang tua atau wali. Petugas bank akan mengaktifkan rekening SimPel siswa. Setelah rekening aktif, dana bantuan akan masuk sesuai jadwal termin dan bisa ditarik atau dicek mutasinya. Penerima di bawah umur wajib didampingi orang tua atau wali saat aktivasi.</p>
<h2>Kesalahan Umum Cara Cek Penerima PIP 2026 dan Solusinya</h2>
<p>Banyak pengecekan gagal bukan karena datanya tidak ada, melainkan karena kesalahan teknis yang sebenarnya mudah diperbaiki. Pertama, salah ketik NISN atau NIK. NISN selalu 10 digit dan NIK 16 digit; pastikan tidak ada spasi atau angka yang tertukar. Salin dari Kartu Keluarga bila perlu.</p>
<p>Kedua, captcha tidak terbaca. Soal matematika di portal kadang tampil kecil di layar HP. Perbesar tampilan browser (zoom) sebelum menjawab, lalu klik cek ulang jika jawaban ditolak. Ketiga, situs tidak bisa dibuka atau lambat. Pada jam sibuk, terutama awal periode pencairan, trafik portal melonjak. Coba lagi di luar jam sibuk, misalnya pagi hari, atau gunakan mode desktop di browser HP.</p>
<p>Keempat, data tidak ditemukan padahal merasa berhak. Selain memastikan ketikan benar, ingat bahwa data berasal dari Dapodik. Jika sekolah belum memasukkan atau memperbarui datamu, portal tidak akan menampilkannya. Solusinya adalah meminta operator sekolah memeriksa dan memperbaiki data Dapodik, bukan mengulang pengecekan tanpa henti.</p>
<h2>FAQ Cek Penerima PIP 2026</h2>
<p><strong>1. Apakah cek PIP harus pakai NISN dan NIK sekaligus?</strong><br />
Ya. Portal resmi meminta NISN (10 digit) dan NIK (16 digit) siswa beserta verifikasi keamanan. Tanpa kedua data yang valid, sistem tidak bisa menemukan data penerima.</p>
<p><strong>2. Saya sudah cek tetapi nama tidak ditemukan, apa yang harus dilakukan?</strong><br />
Pertama, pastikan NISN dan NIK diketik benar tanpa spasi. Jika tetap tidak ditemukan, kemungkinan data belum tervalidasi di Dapodik atau kamu belum masuk kuota termin berjalan. Konfirmasikan ke pihak sekolah atau dinas pendidikan setempat untuk memastikan status usulanmu.</p>
<p><strong>3. Kapan dana PIP termin 3 tahun 2026 cair?</strong><br />
Termin ketiga disalurkan pada periode Oktober sampai Desember 2026. Pencairan tidak serentak, melainkan bertahap per wilayah dan per jenjang, jadi pantau status di portal resmi secara berkala.</p>
<p><strong>4. Apakah dana PIP bisa hangus jika tidak segera diambil?</strong><br />
Dana yang sudah masuk ke rekening SimPel aman tersimpan di rekening siswa. Namun penerima baru yang belum aktivasi rekening tidak akan menerima transfer dana sampai aktivasi selesai. Segera aktivasi begitu namamu tercatat sebagai penerima.</p>
<p><strong>5. Apakah siswa madrasah bisa menerima PIP?</strong><br />
Bisa. Siswa madrasah di bawah Kementerian Agama juga tercakup dalam skema bantuan dengan besaran yang sama, mengikuti ketentuan penyaluran yang berlaku.</p>
<p><strong>6. Apakah penerima PIP bisa juga mendapat KIP Kuliah?</strong><br />
Bisa, karena keduanya adalah program berbeda di jenjang yang berbeda. PIP menyasar siswa sekolah, sedangkan KIP Kuliah menyasar mahasiswa. Selama kamu memenuhi syarat di masing-masing jenjang, keduanya tidak saling menggugurkan. Justru riwayat sebagai penerima PIP sering menjadi nilai tambah saat pengajuan KIP Kuliah karena datamu sudah tercatat di sistem bantuan pendidikan.</p>
<h2>Kesimpulan</h2>
<p>Cara cek penerima PIP 2026 lewat HP hanya butuh tiga langkah inti: buka pip.kemendikdasmen.go.id, masukkan NISN dan NIK, lalu baca statusnya. Pahami jadwal tiga termin dan arti tiap status agar kamu tidak panik ketika dana belum masuk, dan segera aktivasi rekening SimPel kalau kamu penerima baru.</p>
<p>Buat kamu yang sudah lulus SMA dan melanjutkan ke perguruan tinggi, ada bantuan sejenis di jenjang kuliah. Baca juga panduan <a href="/cara-daftar-kip-kuliah-2026/">cara daftar KIP Kuliah 2026</a> yang sudah terbit di blog ini untuk memahami syarat, jadwal, dan alur pendaftarannya.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramzilhuda.com/cara-cek-penerima-pip-2026/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1426</post-id>	</item>
		<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>Git Branching untuk Pemula: Kolaborasi Tanpa Takut Konflik</title>
		<link>https://ramzilhuda.com/git-branching-untuk-pemula/</link>
					<comments>https://ramzilhuda.com/git-branching-untuk-pemula/#respond</comments>
		
		<dc:creator><![CDATA[ramzilhuda]]></dc:creator>
		<pubDate>Mon, 09 Nov 2026 02:00:16 +0000</pubDate>
				<category><![CDATA[Tutorial Pemrograman]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[git branching]]></category>
		<category><![CDATA[kolaborasi]]></category>
		<category><![CDATA[merge conflict]]></category>
		<category><![CDATA[tutorial git]]></category>
		<guid isPermaLink="false">https://ramzilhuda.com/?p=1418</guid>

					<description><![CDATA[Bekerja sendirian dengan Git itu relatif tenang, tetapi begitu proyek dikerjakan beramai-ramai, ketakutan terbesar pemula biasanya sama: bagaimana kalau perubahan saya merusak kode teman? Jawabannya ada pada satu fitur Git yang paling powerful, yaitu branching. Panduan git branching pemula ini akan mengajarkanmu membuat cabang kerja yang aman, menggabungkannya kembali, menyelesaikan merge conflict tanpa panik, sampai [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Bekerja sendirian dengan Git itu relatif tenang, tetapi begitu proyek dikerjakan beramai-ramai, ketakutan terbesar pemula biasanya sama: bagaimana kalau perubahan saya merusak kode teman? Jawabannya ada pada satu fitur Git yang paling powerful, yaitu branching. Panduan git branching pemula ini akan mengajarkanmu membuat cabang kerja yang aman, menggabungkannya kembali, menyelesaikan merge conflict tanpa panik, sampai alur pull request yang dipakai tim profesional.</p>
<p>Kalau kamu belum familier dengan dasar Git seperti commit dan push, baca dulu <a href="https://ramzilhuda.com/tutorial-git-github-pemula/">Tutorial Git dan GitHub untuk Pemula: Dari Instalasi sampai Push Pertama</a>. Artikel ini mengasumsikan kamu sudah bisa membuat repository, commit perubahan, dan push ke GitHub, lalu fokus sepenuhnya pada dunia branching.</p>
<p><img data-recalc-dims="1" decoding="async" alt="Diagram alur Git branching dari main ke feature lalu merge kembali" src="https://i0.wp.com/ramzilhuda.com/wp-content/uploads/2026/10/batch3-18-isi.webp?ssl=1" /></p>
<h2>Git Branching Pemula: Kenapa Butuh Branch</h2>
<p>Branch adalah cabang dari riwayat commit yang memungkinkanmu bekerja secara terisolasi. Analogi paling pas: branch <code>main</code> adalah jalan tol yang harus selalu mulus dan bisa dipakai, sedangkan branch fitur adalah jalan kecil tempatmu bereksperimen. Bila eksperimenmu gagal, jalan tol tetap aman. Bila berhasil, kamu menggabungkannya kembali ke jalan tol dengan terkendali.</p>
<p>Tanpa branch, semua orang commit langsung ke <code>main</code> dan risiko tabrakan sangat tinggi. Dengan branch, setiap fitur atau perbaikan bug dikerjakan di cabangnya sendiri, diuji sampai yakin, baru digabung. Inilah fondasi kolaborasi modern yang dipakai dari startup kecil sampai perusahaan <a href="https://ramzilhuda.com/5-hal-yang-kamu-ketahui-setelah-membaca-teks-teknologi-pangan/">teknologi</a> raksasa.</p>
<p>Satu hal yang perlu diluruskan: membuat branch di Git itu murah dan instan, tidak seperti membuat salinan folder secara manual. Branch hanyalah penanda yang menunjuk ke sebuah commit, jadi jangan ragu membuatnya untuk setiap pekerjaan, sekecil apa pun itu.</p>
<h2>Membuat dan Berpindah Branch</h2>
<p>Perintah dasarnya sederhana. Untuk melihat daftar branch yang ada, jalankan <code>git branch</code>. Branch yang aktif ditandai bintang. Untuk membuat branch baru sekaligus pindah ke sana, cara modernnya memakai <code>git switch -c</code>.</p>
<pre><code class="language-bash"># Lihat branch yang ada
git branch
# * main

# Buat branch baru &quot;fitur-login&quot; dan langsung pindah ke sana
git switch -c fitur-login

# Verifikasi posisi
git branch
#   main
# * fitur-login
</code></pre>
<p>Perintah lama <code>git checkout -b fitur-login</code> melakukan hal yang sama dan masih banyak dipakai di tutorial lama, jadi kenali keduanya. Namun untuk pemula, biasakan <code>git switch</code> karena lebih jelas maksudnya: <code>switch</code> untuk berpindah, sedangkan <code>checkout</code> versi lama punya terlalu banyak fungsi ganda yang membingungkan.</p>
<p>Setelah pindah branch, semua commit yang kamu buat hanya tercatat di branch tersebut. Branch <code>main</code> tidak tersentuh sama sekali sampai kamu memutuskan untuk merge. Untuk kembali ke <code>main</code>, cukup jalankan <code>git switch main</code>. Kamu bisa berpindah bolak-balik dengan aman selama tidak ada perubahan yang belum di-commit.</p>
<h2>Merge: Menggabungkan Branch Kembali</h2>
<p>Setelah pekerjaan di branch fitur selesai dan sudah di-commit, saatnya menggabungkannya ke <code>main</code>. Alurnya selalu sama: pindah dulu ke branch tujuan, lalu merge branch sumber ke dalamnya.</p>
<pre><code class="language-bash"># 1. Pindah ke branch tujuan (main)
git switch main

# 2. Pastikan main dalam kondisi terbaru
git pull origin main

# 3. Gabungkan branch fitur-login ke main
git merge fitur-login
</code></pre>
<p>Bila tidak ada konflik, Git melakukan fast-forward merge: penanda <code>main</code> tinggal dimajukan ke commit terbaru dari branch fitur. Riwayatnya tetap linear dan bersih. Inilah skenario ideal yang terjadi bila tidak ada orang lain yang mengubah baris yang sama selama kamu bekerja.</p>
<p>Setelah merge berhasil dan sudah di-push, branch fitur yang sudah tidak dipakai sebaiknya dihapus agar daftar branch tetap rapi.</p>
<pre><code class="language-bash"># Hapus branch lokal yang sudah di-merge
git branch -d fitur-login

# Hapus branch di remote (GitHub)
git push origin --delete fitur-login
</code></pre>
<p>Flag <code>-d</code> hanya mau menghapus branch yang sudah di-merge, sehingga aman dari kecelakaan. Bila kamu yakin ingin menghapus branch yang belum di-merge, barulah pakai <code>-D</code> dengan penuh kesadaran.</p>
<h2>Simulasi Merge Conflict dan Cara Me-resolve</h2>
<p>Merge conflict terjadi saat dua branch mengubah baris yang sama pada file yang sama, sehingga Git tidak bisa memutuskan versi mana yang benar. Ini bukan error yang harus ditakuti, melainkan Git yang meminta keputusanmu secara eksplisit. Mari simulasikan supaya kamu mengalaminya di lingkungan aman.</p>
<p>Pertama siapkan skenario konfliknya. Buat file <code>catatan.txt</code> di branch <code>main</code>, commit, lalu buat branch <code>fitur-a</code> yang mengubah baris pertama file itu dan commit. Kembali ke <code>main</code>, ubah baris pertama yang sama dengan isi berbeda, dan commit juga.</p>
<pre><code class="language-bash"># Di main: buat file awal
echo &quot;Baris pertama versi awal&quot; &gt; catatan.txt
git add catatan.txt
git commit -m &quot;Tambah catatan awal&quot;

# Buat branch fitur-a dan ubah baris pertama
git switch -c fitur-a
echo &quot;Baris pertama versi fitur A&quot; &gt; catatan.txt
git add catatan.txt
git commit -m &quot;Ubah baris pertama di fitur-a&quot;

# Kembali ke main dan ubah baris pertama yang sama
git switch main
echo &quot;Baris pertama versi main&quot; &gt; catatan.txt
git add catatan.txt
git commit -m &quot;Ubah baris pertama di main&quot;

# Coba merge: KONFLIK!
git merge fitur-a
</code></pre>
<p>Git akan melaporkan <code>CONFLICT (content): Merge conflict in catatan.txt</code> dan menghentikan proses merge. Buka file tersebut dan kamu akan melihat penanda konflik seperti ini.</p>
<pre><code>&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD
Baris pertama versi main
=======
Baris pertama versi fitur A
&gt;&gt;&gt;&gt;&gt;&gt;&gt; fitur-a
</code></pre>
<p>Bagian antara <code>&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD</code> dan <code>=======</code> adalah versimu saat ini (main), sedangkan antara <code>=======</code> dan <code>&gt;&gt;&gt;&gt;&gt;&gt;&gt; fitur-a</code> adalah versi dari branch yang di-merge. Tugasmu sederhana: edit file menjadi versi final yang benar, lalu hapus semua penanda konfliknya.</p>
<pre><code class="language-bash"># Setelah mengedit file menjadi versi final:
# &quot;Baris pertama versi gabungan yang benar&quot;

# Tandai konflik selesai
git add catatan.txt

# Selesaikan merge dengan commit
git commit -m &quot;Resolve conflict: gabungkan perubahan main dan fitur-a&quot;
</code></pre>
<p>Kunci menghadapi konflik adalah tetap tenang dan baca penandanya baik-baik. Konflik hampir selalu hanya soal beberapa baris, bukan seluruh file. Editor modern seperti VS Code bahkan menampilkan tombol Accept Current Change dan Accept Incoming Change sehingga kamu cukup klik. Setelah terbiasa, menyelesaikan konflik hanya butuh waktu satu dua menit.</p>
<h2>Alur Pull Request Sederhana untuk Kolaborasi Tim</h2>
<p>Di tim profesional, merge langsung ke <code>main</code> dari lokal biasanya dilarang. Sebagai gantinya dipakai pull request (PR), yaitu permintaan peninjauan sebelum kode digabung. Alurnya memberi lapisan keamanan berupa review dari rekan tim dan pengecekan otomatis.</p>
<p>Alur sederhananya begini. Pertama, push branch fiturmu ke GitHub dengan <code>git push origin fitur-login</code>. Kedua, buka halaman repository di GitHub dan klik tombol Compare and pull request yang muncul otomatis. Ketiga, tulis deskripsi perubahan dengan jelas: apa yang diubah dan kenapa. Keempat, minta rekan tim me-review. Mereka bisa memberi komentar per baris kode dan meminta perbaikan sebelum menyetujui.</p>
<p>Kelima, setelah disetujui, klik Merge pull request di GitHub. GitHub menawarkan tiga mode merge: Create a merge commit yang jujur mencatat riwayat, Squash and merge yang memadatkan semua commit branch menjadi satu commit rapi di main, dan Rebase and merge yang menempelkan commit satu per satu. Untuk pemula, squash and merge paling rapi karena satu fitur menjadi satu commit di main.</p>
<p>Keenam, hapus branch fitur dari GitHub setelah di-merge dan sinkronkan lokalmu dengan <code>git switch main</code> lalu <code>git pull</code>. Siklus ini berulang untuk setiap fitur. Mungkin terdengar panjang, tetapi setelah dua tiga kali praktik, alurnya menjadi kebiasaan yang hanya butuh beberapa menit.</p>
<h2>Git Branching Pemula: Aturan Main yang Disarankan</h2>
<p>Supaya branching tetap rapi saat tim membesar, ikuti beberapa konvensi sederhana. Pertama, beri nama branch yang deskriptif dengan awalan jenis pekerjaannya, misalnya <code>fitur/login-google</code>, <code>perbaikan/bug-tombol-kirim</code>, atau <code>docs/update-readme</code>. Hindari nama seperti <code>branch-baru</code> atau <code>coba-coba</code> yang tidak memberi informasi apa pun.</p>
<p>Kedua, buat branch dari <code>main</code> yang terbaru. Sebelum membuat branch baru, selalu <code>git switch main</code> lalu <code>git pull</code> dulu supaya titik berangkatmu mutakhir. Ketiga, jaga branch tetap pendek umur: semakin lama branch hidup terpisah, semakin besar <a href="https://ramzilhuda.com/ruang-sampel-kejadian-peluang-lanjutan/">peluang</a> konfliknya. Usahakan satu branch selesai dan di-merge dalam hitungan hari, bukan minggu.</p>
<p>Keempat, commit kecil dan sering dengan pesan yang jelas di setiap branch. Riwayat commit yang granular memudahkan review dan memudahkan melacak kapan bug muncul. Kelima, jangan pernah commit langsung ke <code>main</code> bila sudah bekerja dalam tim. Jadikan branch dan pull request sebagai satu-satunya jalan menuju <code>main</code>, tanpa pengecualian.</p>
<h2>Cheat Sheet Perintah Git Branching</h2>
<p>Tabel berikut merangkum semua perintah penting dari artikel ini untuk ditempel di catatanmu.</p>
<table>
<thead>
<tr>
<th>Perintah</th>
<th>Fungsi</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>git branch</code></td>
<td>Melihat daftar branch lokal</td>
</tr>
<tr>
<td><code>git switch -c nama-branch</code></td>
<td>Membuat branch baru dan pindah ke sana</td>
</tr>
<tr>
<td><code>git switch main</code></td>
<td>Pindah ke branch main</td>
</tr>
<tr>
<td><code>git merge nama-branch</code></td>
<td>Menggabungkan branch ke branch aktif</td>
</tr>
<tr>
<td><code>git branch -d nama-branch</code></td>
<td>Menghapus branch lokal yang sudah di-merge</td>
</tr>
<tr>
<td><code>git log --oneline --graph --all</code></td>
<td>Melihat riwayat branch dalam bentuk graf</td>
</tr>
<tr>
<td><code>git status</code></td>
<td>Memeriksa status file dan konflik</td>
</tr>
<tr>
<td><code>git push origin nama-branch</code></td>
<td>Mengirim branch ke GitHub</td>
</tr>
</tbody>
</table>
<p>Perintah <code>git log --oneline --graph --all</code> layak mendapat perhatian khusus karena menampilkan visualisasi cabang yang sangat membantu memahami apa yang terjadi. Jalankan sesekali untuk melihat bagaimana branch-branchmu bercabang dan bergabung kembali.</p>
<h2>Langkah Selanjutnya</h2>
<p>Kamu sekarang menguasai inti git branching pemula: membuat dan berpindah branch dengan <code>switch</code>, menggabungkan dengan <code>merge</code>, menyelesaikan merge conflict tanpa panik, sampai alur pull request yang dipakai tim profesional. Kombinasikan dengan dasar commit dan push yang sudah kamu kuasai, dan kamu siap berkolaborasi di proyek tim sungguhan.</p>
<p>Satu konvensi yang dipakai hampir semua tim profesional adalah pola penamaan branch yang konsisten, misalnya <code>fitur/login-google</code>, <code>fix/bug-validasi</code>, atau <code>hotfix/crash-checkout</code>. Nama seperti ini membuat isi branch langsung terbaca dari daftar branch tanpa harus membuka commit-nya. Biasakan juga menghapus branch lokal yang sudah di-merge dan tidak dipakai lagi agar daftar branch tetap bersih. Dua kebiasaan sederhana ini membuat kolaborasimu terlihat profesional sejak hari pertama.</p>
<p>Praktik terbaik berikutnya adalah membiasakan alur ini di proyek pribadimu sendiri, misalnya proyek <a href="https://ramzilhuda.com/cara-membuat-project-sederhana-menggunakan-laravel-part-1/">Laravel</a> yang sedang kamu bangun. Setiap selesai satu bab dari <a href="https://ramzilhuda.com/tutorial-git-github-pemula/">Tutorial Git dan GitHub untuk Pemula</a>, buat branch baru untuk latihan bab berikutnya. Kebiasaan kecil inilah yang membedakan developer yang siap kerja tim dengan yang hanya bisa ngoding sendirian.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramzilhuda.com/git-branching-untuk-pemula/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1418</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>Belajar CSS Flexbox dan Grid: Layout Modern dengan Contoh Praktis</title>
		<link>https://ramzilhuda.com/belajar-css-flexbox-dan-grid/</link>
					<comments>https://ramzilhuda.com/belajar-css-flexbox-dan-grid/#respond</comments>
		
		<dc:creator><![CDATA[ramzilhuda]]></dc:creator>
		<pubDate>Sat, 07 Nov 2026 02:00:34 +0000</pubDate>
				<category><![CDATA[Tutorial Pemrograman]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[css grid]]></category>
		<category><![CDATA[flexbox]]></category>
		<category><![CDATA[layout web]]></category>
		<category><![CDATA[tutorial css]]></category>
		<guid isPermaLink="false">https://ramzilhuda.com/?p=1409</guid>

					<description><![CDATA[Mengatur tata letak halaman web dulu adalah pekerjaan yang menyebalkan. Developer zaman dulu memakai float dan clearfix yang rapuh, atau tabel yang tidak semestinya dipakai untuk layout. Untungnya era itu sudah berakhir. Panduan CSS Flexbox dan Grid ini akan mengajarkanmu dua sistem layout modern bawaan CSS yang membuat penyusunan halaman menjadi jauh lebih masuk akal: [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Mengatur tata letak halaman web dulu adalah pekerjaan yang menyebalkan. Developer zaman dulu memakai float dan clearfix yang rapuh, atau tabel yang tidak semestinya dipakai untuk <a href="https://ramzilhuda.com/cara-menggunakan-coordinator-layout-di-android-studio-pertama-kali/">layout</a>. Untungnya era itu sudah berakhir. Panduan CSS Flexbox dan Grid ini akan mengajarkanmu dua sistem layout modern bawaan CSS yang membuat penyusunan halaman menjadi jauh lebih masuk akal: Flexbox untuk layout satu dimensi dan Grid untuk layout dua dimensi.</p>
<p>Di akhir artikel ini kamu akan bisa membuat dua komponen paling umum di web modern: deretan kartu produk yang rapi dan navbar responsif yang menyesuaikan layar HP. Semua contoh memakai CSS murni tanpa framework, supaya kamu benar-benar paham cara kerja di balik layarnya sebelum memakai bantuan seperti Bootstrap atau Tailwind.</p>
<p><img data-recalc-dims="1" decoding="async" alt="Diagram perbandingan Flexbox satu dimensi dan Grid dua dimensi" src="https://i0.wp.com/ramzilhuda.com/wp-content/uploads/2026/10/batch3-16-isi.webp?ssl=1" /></p>
<h2>CSS Flexbox dan Grid: Dua Senjata Layout Modern</h2>
<p>Sebelum praktik, pahami dulu perbedaan filosofi keduanya lewat analogi sederhana. Flexbox itu seperti mengatur antrean: elemen disusun dalam satu baris atau satu kolom, dan kamu mengatur jarak serta perataannya di sepanjang jalur itu. Grid itu seperti mengatur ubin lantai: kamu membagi area menjadi baris dan kolom, lalu menempatkan elemen ke petak-petak yang tersedia.</p>
<p>Aturan praktisnya: pakai Flexbox untuk komponen satu dimensi seperti navbar, deretan tombol, atau kartu yang sejajar horizontal. Pakai Grid untuk layout dua dimensi seperti galeri foto, dashboard, atau keseluruhan kerangka halaman. Keduanya bisa digabung: Grid untuk kerangka besar halaman, Flexbox untuk mengatur isi di dalam setiap petaknya.</p>
<p>Kedua <a href="https://ramzilhuda.com/5-hal-yang-kamu-ketahui-setelah-membaca-teks-teknologi-pangan/">teknologi</a> ini didukung penuh semua browser modern, jadi kamu tidak perlu khawatir soal kompatibilitas untuk proyek baru. Mari mulai dari Flexbox.</p>
<h2>Flexbox: Mengatur Layout Satu Dimensi</h2>
<p>Flexbox bekerja dengan dua peran: flex container (wadah) dan flex item (isi di dalamnya). Kamu mengubah sebuah elemen menjadi flex container cukup dengan satu baris: <code>display: flex</code>. Seketika itu juga semua anak langsungnya menjadi flex item yang tersusun horizontal dari kiri ke kanan.</p>
<pre><code class="language-html">&lt;div class=&quot;container&quot;&gt;
  &lt;div class=&quot;kotak&quot;&gt;1&lt;/div&gt;
  &lt;div class=&quot;kotak&quot;&gt;2&lt;/div&gt;
  &lt;div class=&quot;kotak&quot;&gt;3&lt;/div&gt;
&lt;/div&gt;
</code></pre>
<pre><code class="language-css">.container {
  display: flex;
  gap: 12px; /* jarak antar item */
}

.kotak {
  width: 80px;
  height: 80px;
  background-color: orange;
  color: white;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 24px;
  border-radius: 8px;
}
</code></pre>
<p>Properti <code>gap</code> memberi jarak seragam antar item tanpa margin manual yang merepotkan. Perhatikan juga trik di class <code>.kotak</code>: ia sendiri menjadi flex container kecil agar angka di dalamnya rata tengah sempurna, teknik yang sangat sering dipakai untuk membuat tombol, badge, dan avatar.</p>
<h2>Properti Penting Flexbox yang Wajib Hafal</h2>
<p>Kekuatan Flexbox ada pada properti-propertinya. Berikut empat yang paling sering dipakai, semuanya ditulis di flex container.</p>
<p><strong>justify-content</strong> mengatur perataan item sepanjang sumbu utama (horizontal bila arah default). Nilainya antara lain <code>flex-start</code> (rapat kiri), <code>center</code> (tengah), <code>flex-end</code> (rapat kanan), <code>space-between</code> (ujung ke ujung dengan jarak merata), dan <code>space-around</code>.</p>
<p><strong>align-items</strong> mengatur perataan sepanjang sumbu silang (vertikal bila arah default). Nilai populernya <code>stretch</code> (default, item melar setinggi container), <code>center</code>, <code>flex-start</code>, dan <code>flex-end</code>. Kombinasi <code>justify-content: center</code> dan <code>align-items: center</code> adalah cara termudah membuat konten tepat di tengah layar.</p>
<p><strong>flex-direction</strong> mengubah arah susunan. Nilai defaultnya <code>row</code> (horizontal kiri ke kanan). Ubah menjadi <code>column</code> untuk susunan vertikal ke bawah, yang sering dipakai untuk layout <a href="https://ramzilhuda.com/tutorial-membuat-aplikasi-quiz-sederhana-menggunakan-android-studio/">mobile</a> atau tumpukan form.</p>
<p><strong>flex-wrap</strong> menentukan apa yang terjadi bila item tidak muat satu baris. Nilai default <code>nowrap</code> memaksa semua item berdesakan, sedangkan <code>wrap</code> memindahkan kelebihan item ke baris baru dengan rapi.</p>
<pre><code class="language-css">.navbar {
  display: flex;
  justify-content: space-between; /* logo kiri, menu kanan */
  align-items: center;             /* sejajar vertikal */
  padding: 16px 24px;
}

.formulir {
  display: flex;
  flex-direction: column; /* input tersusun ke bawah */
  gap: 12px;
  max-width: 400px;
}
</code></pre>
<p>Contoh <code>.navbar</code> di atas adalah pola paling klasik di web: logo di kiri dan menu di kanan hanya dengan satu baris <code>justify-content: space-between</code>. Hafalkan pola ini karena kamu akan menuliskannya berkali-kali.</p>
<h2>CSS Grid: Mengatur Layout Dua Dimensi</h2>
<p>Kalau Flexbox mengatur antrean, Grid mengatur petak. Kamu mengubah elemen menjadi grid container dengan <code>display: grid</code>, lalu mendefinisikan kolomnya dengan <code>grid-template-columns</code>. Fungsi <code>repeat()</code> mempermudah penulisan kolom yang berulang.</p>
<pre><code class="language-html">&lt;div class=&quot;galeri&quot;&gt;
  &lt;div class=&quot;foto&quot;&gt;1&lt;/div&gt;
  &lt;div class=&quot;foto&quot;&gt;2&lt;/div&gt;
  &lt;div class=&quot;foto&quot;&gt;3&lt;/div&gt;
  &lt;div class=&quot;foto&quot;&gt;4&lt;/div&gt;
  &lt;div class=&quot;foto&quot;&gt;5&lt;/div&gt;
  &lt;div class=&quot;foto&quot;&gt;6&lt;/div&gt;
&lt;/div&gt;
</code></pre>
<pre><code class="language-css">.galeri {
  display: grid;
  grid-template-columns: repeat(3, 1fr); /* 3 kolom sama lebar */
  gap: 16px;
}

.foto {
  background-color: #1a3a6e;
  color: white;
  height: 120px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 24px;
  border-radius: 8px;
}
</code></pre>
<p>Satuan <code>1fr</code> artinya satu fraksi dari ruang yang tersedia, sehingga tiga kolom <code>1fr</code> selalu sama lebar mengikuti lebar container. Ini jauh lebih elegan dibanding menghitung persen manual. Properti <code>gap</code> di Grid memberi jarak antar baris sekaligus antar kolom dalam satu deklarasi.</p>
<p>Untuk membuat item melintasi beberapa kolom, pakai <code>grid-column: span 2</code> pada itemnya. Teknik ini berguna untuk membuat kartu unggulan yang lebih lebar dari kartu biasa.</p>
<pre><code class="language-css">.foto-unggulan {
  grid-column: span 2; /* selebar 2 kolom */
}
</code></pre>
<p>Fungsi <code>minmax()</code> membuat grid responsif tanpa media query: <code>grid-template-columns: repeat(auto-fill, minmax(200px, 1fr))</code> otomatis mengatur jumlah kolom mengikuti lebar layar, dengan tiap kolom minimal 200 piksel. Satu baris ini menggantikan banyak kode responsif manual.</p>
<h2>Studi Kasus: Layout Kartu Produk Responsif</h2>
<p>Sekarang gabungkan pengetahuanmu menjadi komponen nyata: deretan kartu produk untuk toko online. Setiap kartu berisi gambar, nama produk, harga, dan tombol beli. Kita pakai Grid untuk deretannya dan Flexbox untuk isi tiap kartu.</p>
<pre><code class="language-html">&lt;div class=&quot;daftar-produk&quot;&gt;
  &lt;div class=&quot;kartu&quot;&gt;
    &lt;div class=&quot;gambar-produk&quot;&gt;Gambar&lt;/div&gt;
    &lt;h3&gt;Kopi Arabika 200g&lt;/h3&gt;
    &lt;p class=&quot;harga&quot;&gt;Rp45.000&lt;/p&gt;
    &lt;button&gt;Beli&lt;/button&gt;
  &lt;/div&gt;
  &lt;!-- duplikasi .kartu untuk produk lain --&gt;
&lt;/div&gt;
</code></pre>
<pre><code class="language-css">.daftar-produk {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: 20px;
  padding: 20px;
}

.kartu {
  border: 1px solid #ddd;
  border-radius: 12px;
  padding: 16px;
  display: flex;              /* Flexbox di dalam kartu */
  flex-direction: column;     /* isi tersusun ke bawah */
  gap: 8px;
}

.gambar-produk {
  background-color: #f0f0f0;
  height: 140px;
  border-radius: 8px;
  display: flex;
  align-items: center;
  justify-content: center;
  color: #999;
}

.kartu .harga {
  font-weight: bold;
  color: #e67e22;
  font-size: 18px;
}

.kartu button {
  margin-top: auto; /* dorong tombol ke bawah kartu */
  padding: 10px;
  border: none;
  border-radius: 8px;
  background-color: #1a3a6e;
  color: white;
  cursor: pointer;
}
</code></pre>
<p>Perhatikan trik <code>margin-top: auto</code> pada tombol: ia mendorong tombol ke dasar kartu sehingga semua tombol sejajar walau deskripsi produk berbeda panjang. Ini contoh sempurna kolaborasi Grid di luar dan Flexbox di dalam. Coba ubah lebar browser dan saksikan jumlah kolom menyesuaikan otomatis tanpa satu pun media query.</p>
<h2>Studi Kasus: Navbar Responsif dengan Flexbox</h2>
<p>Navbar adalah komponen wajib hampir setiap website. Kita buat navbar dengan logo di kiri dan menu di kanan untuk layar besar, yang berubah menjadi tumpukan vertikal di layar kecil memakai satu media query.</p>
<pre><code class="language-html">&lt;nav class=&quot;navbar&quot;&gt;
  &lt;div class=&quot;logo&quot;&gt;TokoKu&lt;/div&gt;
  &lt;ul class=&quot;menu&quot;&gt;
    &lt;li&gt;&lt;a href=&quot;#&quot;&gt;Beranda&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#&quot;&gt;Produk&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#&quot;&gt;Tentang&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#&quot;&gt;Kontak&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/nav&gt;
</code></pre>
<pre><code class="language-css">.navbar {
  display: flex;
  justify-content: space-between;
  align-items: center;
  background-color: #1a3a6e;
  padding: 16px 24px;
}

.logo {
  color: white;
  font-weight: bold;
  font-size: 20px;
}

.menu {
  display: flex;
  gap: 20px;
  list-style: none;
  margin: 0;
  padding: 0;
}

.menu a {
  color: white;
  text-decoration: none;
}

/* Layar kecil: ubah jadi vertikal */
@media (max-width: 600px) {
  .navbar {
    flex-direction: column;
    align-items: flex-start;
    gap: 12px;
  }

  .menu {
    flex-direction: column;
    gap: 8px;
  }
}
</code></pre>
<p>Kuncinya hanya dua baris di media query: <code>flex-direction: column</code> pada navbar dan menu. Sisanya mengikuti otomatis. Pola ini jauh lebih ringkas dibanding teknik float zaman dulu yang butuh clearfix dan perhitungan lebar manual.</p>
<h2>CSS Flexbox dan Grid: Kapan Memakai yang Mana</h2>
<p>Bingung memilih di antara keduanya adalah hal wajar. Pakai panduan cepat ini. Pilih Flexbox ketika kamu mengatur elemen dalam satu arah: navbar, deretan tombol aksi, form vertikal, atau konten yang rata tengah. Pilih Grid ketika kamu butuh kendali dua dimensi: galeri, dashboard, pricing table, atau kerangka halaman dengan header, sidebar, dan konten.</p>
<p>Bila ragu, tanyakan pada dirimu: apakah aku menyusun dalam satu arah saja? Bila ya, Flexbox jawabannya. Apakah aku butuh baris DAN kolom sekaligus? Bila ya, Grid jawabannya. Dalam praktiknya kamu akan sering memakai keduanya bersamaan seperti pada studi kasus kartu produk di atas, dan itu justru praktik yang dianjurkan.</p>
<p>Satu catatan: jangan memakai Grid untuk hal sepele satu dimensi seperti meratakan satu tombol ke kanan, dan jangan memaksa Flexbox untuk layout tabel kompleks. Memakai alat yang tepat membuat kode lebih pendek dan mudah dirawat.</p>
<h2>Kesalahan Umum Saat Belajar Flexbox dan Grid</h2>
<p>Pertama, lupa mengatur <code>display: flex</code> atau <code>display: grid</code> pada container tetapi properti seperti <code>justify-content</code> ditulis di item. Properti layout selalu ditulis di container, bukan di itemnya. Kedua, mengira <code>align-items</code> dan <code>justify-content</code> selalu berarti vertikal dan horizontal. Keduanya mengikuti sumbu yang berubah bila <code>flex-direction</code> diganti ke <code>column</code>.</p>
<p>Ketiga, memakai persen untuk kolom Grid padahal <code>fr</code> lebih tepat karena otomatis memperhitungkan <code>gap</code>. Keempat, tidak mereset <code>margin</code> dan <code>padding</code> bawaan pada <code>ul</code> saat membuat menu navbar, sehingga muncul jarak misterius. Kelima, menumpuk terlalu banyak nesting flex container yang sebenarnya bisa diselesaikan satu level Grid. Bila kode layoutmu terasa berbelit, biasanya ada cara yang lebih sederhana.</p>
<h2>Langkah Selanjutnya</h2>
<p>Kamu sekarang menguasai dua sistem layout modern CSS: Flexbox untuk satu dimensi dan Grid untuk dua dimensi, lengkap dengan dua studi kasus nyata berupa kartu produk responsif dan navbar adaptif. Skill ini langsung terpakai di setiap proyek web yang kamu kerjakan.</p>
<p>Layout yang bagus menjadi jauh lebih hidup dengan interaktivitas. Pelajari cara membuat navbar dan tombolmu merespons klik pengguna di <a href="https://ramzilhuda.com/tutorial-javascript-untuk-pemula/">Tutorial JavaScript untuk Pemula: Variabel, Fungsi, dan Manipulasi DOM</a>. Dan bila kamu ingin melihat bagaimana tampilan seperti ini dipadukan dengan data dari <a href="https://ramzilhuda.com/mengenal-server-peran-dan-tipe-server-yang-perlu-diketahui/">server</a>, <a href="https://ramzilhuda.com/tutorial-laravel-12-crud-pemula/">Tutorial Laravel 12: Membuat CRUD Sederhana dari Nol untuk Pemula</a> menunjukkan sisi backend-nya memakai Blade template yang distyling dengan teknik yang baru saja kamu pelajari.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramzilhuda.com/belajar-css-flexbox-dan-grid/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1409</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>Pendaftaran CPNS 2026: Syarat Umum, Dokumen, dan Cara Buat Akun SSCASN</title>
		<link>https://ramzilhuda.com/pendaftaran-cpns-2026-syarat-cara-daftar/</link>
					<comments>https://ramzilhuda.com/pendaftaran-cpns-2026-syarat-cara-daftar/#respond</comments>
		
		<dc:creator><![CDATA[ramzilhuda]]></dc:creator>
		<pubDate>Tue, 03 Nov 2026 02:00:19 +0000</pubDate>
				<category><![CDATA[Panduan]]></category>
		<category><![CDATA[cpns 2026]]></category>
		<category><![CDATA[formasi cpns 2026]]></category>
		<category><![CDATA[pendaftaran cpns]]></category>
		<category><![CDATA[sscasn bkn]]></category>
		<category><![CDATA[syarat cpns]]></category>
		<guid isPermaLink="false">https://ramzilhuda.com/?p=1386</guid>

					<description><![CDATA[Banyak yang bertanya kapan pendaftaran cpns 2026 dibuka. Jawaban jujurnya: per Oktober 2026, BKN belum mengumumkan jadwal resmi pendaftaran CPNS umum 2026. Karena itu artikel ini disusun sebagai panduan persiapan: status terkini yang terverifikasi, syarat umum dan dokumen yang bisa disiapkan dari sekarang, cara membuat akun SSCASN, serta cara mengenali hoaks yang marak beredar. Begitu [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Banyak yang bertanya kapan pendaftaran cpns 2026 dibuka. Jawaban jujurnya: <strong>per Oktober 2026, BKN belum mengumumkan jadwal resmi pendaftaran CPNS umum 2026.</strong> Karena itu artikel ini disusun sebagai panduan persiapan: status terkini yang terverifikasi, syarat umum dan dokumen yang bisa disiapkan dari sekarang, cara membuat akun SSCASN, serta cara mengenali hoaks yang marak beredar. Begitu jadwal resmi keluar, kamu tinggal daftar tanpa panik.</p>
<p><img data-recalc-dims="1" decoding="async" src="https://i0.wp.com/ramzilhuda.com/wp-content/uploads/2026/10/batch3-12-isi-scaled.webp?ssl=1" alt="Infografis tahapan seleksi CPNS dari pendaftaran sampai pengumuman" /></p>
<h2>Status Terkini: Apakah CPNS 2026 Sudah Dibuka?</h2>
<p><strong>Belum.</strong> Badan Kepegawaian Negara (BKN) memastikan belum ada pengumuman resmi mengenai pembukaan pendaftaran CPNS umum 2026. Portal resmi SSCASN juga belum menampilkan timeline pengadaan CPNS umum 2026.</p>
<p>Yang perlu kamu ketahui dari perkembangan terbaru:</p>
<ul>
<li><strong>Seleksi Sekolah Kedinasan 2026 sudah berjalan</strong> dengan kebutuhan sekitar 4.770 formasi. Ini jalur berbeda dari rekrutmen CPNS umum yang membuka formasi di kementerian, lembaga, dan pemerintah daerah.</li>
<li><strong>Seleksi PPPK 2026 sudah berjalan di beberapa instansi</strong>, misalnya Kementerian HAM dan Kementerian Sosial.</li>
<li>Beredar kabar soal 160 ribu formasi, tetapi rincian resmi per instansi tetap menunggu pengumuman pemerintah.</li>
<li>BKN sudah berulang kali mengingatkan bahwa poster dan tautan yang mengklaim pendaftaran CPNS 2026 telah dibuka adalah <strong>hoaks</strong>.</li>
</ul>
<p>Artinya, masa tunggu ini adalah waktu terbaik untuk persiapan. Pelamar yang dokumennya rapi dan sudah latihan soal sejak awal punya <a href="https://ramzilhuda.com/ruang-sampel-kejadian-peluang-lanjutan/">peluang</a> jauh lebih besar dibanding yang baru siap saat pendaftaran dibuka.</p>
<h2>Waspada Hoaks dan Penipuan CPNS</h2>
<p>Sebelum membahas persiapan, ini peringatan penting karena modusnya makin rapi. Ciri-ciri informasi palsu seputar CPNS:</p>
<ol>
<li>Poster atau tautan yang mengklaim pendaftaran sudah dibuka, padahal BKN belum mengumumkan apa-apa.</li>
<li>Tautan pendaftaran di luar domain resmi pemerintah (bukan *.go.id).</li>
<li>Daftar formasi yang mengaku resmi tetapi tidak berasal dari pengumuman BKN atau KemenPAN-RB.</li>
<li>Permintaan data pribadi melalui situs tidak dikenal.</li>
<li>Permintaan pembayaran atau biaya pendaftaran dalam bentuk apa pun.</li>
<li>Grup <a href="https://ramzilhuda.com/bagaimana-cara-melihata-whatasapp-kita-di-intai-orang-lain/">WhatsApp</a> atau Telegram yang menjanjikan &#8220;jalur khusus&#8221; kelulusan.</li>
</ol>
<p>Ingat prinsipnya: <strong>pendaftaran CPNS melalui SSCASN adalah gratis.</strong> Tidak ada biaya ke pihak mana pun. Informasi valid hanya dirilis melalui portal SSCASN (sscasn.bkn.go.id), situs resmi BKN (bkn.go.id), dan KemenPAN-RB (menpan.go.id). Jika menemukan informasi mencurigakan, verifikasi silang ke kanal resmi tersebut sebelum memercayainya atau menyebarkannya. Simpan tautan kanal resmi BKN di bookmark browser agar kamu tidak perlu mencari ulang setiap kali ada kabar baru.</p>
<h2>Syarat Umum Pendaftaran CPNS</h2>
<p>Syarat final selalu mengikuti pengumuman resmi formasi dan instansi saat seleksi dibuka. Namun berdasarkan pola seleksi tahun-tahun sebelumnya, syarat umum yang hampir selalu diminta adalah:</p>
<ol>
<li>Warga Negara Indonesia.</li>
<li>Berusia minimal 18 tahun dan maksimal 35 tahun pada saat melamar (beberapa formasi khusus punya batas berbeda).</li>
<li>Tidak pernah dipidana dengan pidana penjara 2 tahun atau lebih.</li>
<li>Tidak pernah diberhentikan dengan tidak hormat dari pekerjaan sebelumnya (PNS, TNI, Polri, atau pegawai swasta).</li>
<li>Tidak sedang berstatus sebagai CPNS, PNS, prajurit TNI, atau anggota Polri.</li>
<li>Sehat jasmani dan rohani sesuai persyaratan jabatan.</li>
<li>Pendidikan minimal sesuai dengan formasi yang dilamar (SMA, D3, S1, sesuai ketentuan tiap formasi).</li>
<li>Bersedia ditempatkan di seluruh wilayah Indonesia.</li>
</ol>
<p>Selain syarat umum, tiap instansi dan formasi biasanya menambah syarat khusus, misalnya IPK minimal, akreditasi kampus atau program studi, sertifikat kemampuan bahasa Inggris, atau pengalaman kerja. Baca pengumuman formasi incaranmu dengan teliti saat sudah terbit, karena syarat khusus inilah yang paling sering menggugurkan pelamar di tahap administrasi.</p>
<h2>Dokumen yang Wajib Disiapkan dari Sekarang</h2>
<p>Seleksi administrasi adalah tahap pertama dan paling banyak menggugurkan peserta, sering kali karena kesalahan sepele pada dokumen. Siapkan dari sekarang:</p>
<ol>
<li><strong>KTP elektronik.</strong> Pastikan NIK, nama, tempat dan tanggal lahir sesuai dengan dokumen lain. Perbedaan satu huruf atau angka bisa bermasalah saat verifikasi.</li>
<li><strong>Kartu Keluarga.</strong> Data KK dipakai saat pembuatan akun SSCASN.</li>
<li><strong>Ijazah terakhir yang dilegalisir.</strong> Sesuai jenjang formasi yang diincar.</li>
<li><strong>Transkrip nilai.</strong> IPK harus memenuhi syarat minimal formasi.</li>
<li><strong>Pas foto terbaru.</strong> Umumnya berlatar merah dengan ketentuan ukuran dan pakaian formal yang akan dirinci di pengumuman.</li>
<li><strong>SKCK.</strong> Surat Keterangan Catatan Kepolisian dari Polres setempat, masih berlaku.</li>
<li><strong>Surat keterangan sehat jasmani dan rohani</strong> dari rumah sakit pemerintah atau puskesmas.</li>
<li><strong>Surat lamaran dan daftar riwayat hidup</strong>, mengikuti format yang ditentukan instansi.</li>
<li><strong>Dokumen pendukung formasi khusus</strong>, misalnya sertifikat TOEFL untuk formasi yang mensyaratkan, atau surat pengalaman kerja.</li>
</ol>
<p>Tips praktis: pindai semua dokumen dalam format PDF dan simpan juga versi JPG-nya, karena SSCASN meminta unggahan dengan format dan ukuran file tertentu. Beri nama file yang rapi agar tidak tertukar saat mengunggah.</p>
<h2>Cara Buat Akun SSCASN dan Alur Pendaftaran</h2>
<p>Alur berikut berdasarkan mekanisme portal SSCASN pada seleksi sebelumnya. Tampilannya bisa sedikit berubah, tetapi logikanya sama.</p>
<h3>Membuat akun</h3>
<ol>
<li>Buka portal resmi di sscasn.bkn.go.id melalui browser.</li>
<li>Pilih menu pembuatan akun baru.</li>
<li>Isi NIK, nomor KK, nama lengkap, tempat dan tanggal lahir, nomor HP aktif, dan email aktif. Pastikan email dan nomor HP benar-benar aktif karena seluruh informasi penting dikirim ke sana.</li>
<li>Buat password dan pertanyaan pengaman, lalu simpan.</li>
<li>Selesaikan pendaftaran akun dan catat baik-baik username serta passwordnya.</li>
</ol>
<h3>Mendaftar formasi</h3>
<ol>
<li>Login ke portal SSCASN dengan akun yang baru dibuat.</li>
<li>Lengkapi biodata diri sesuai KTP.</li>
<li>Pilih jenis seleksi (CPNS), lalu pilih instansi dan formasi yang sesuai dengan kualifikasi pendidikanmu.</li>
<li>Unggah seluruh dokumen yang diminta sesuai format dan ukuran yang ditentukan.</li>
<li>Periksa kembali semua isian di halaman resume. Tahap ini krusial karena kesalahan yang lolos dari sini sulit diperbaiki.</li>
<li>Akhiri pendaftaran dan cetak kartu informasi akun serta kartu pendaftaran sebagai bukti.</li>
</ol>
<p>Satu akun hanya bisa dipakai untuk satu formasi pada satu periode seleksi, jadi pilih formasimu dengan perhitungan matang, bukan asal klik.</p>
<h2>Strategi Memilih Formasi yang Tepat</h2>
<p>Satu akun hanya bisa dipakai untuk satu formasi per periode seleksi, jadi keputusan ini sangat menentukan. Beberapa prinsip yang dipakai pelamar berpengalaman:</p>
<ol>
<li><strong>Ukur dirimu sendiri.</strong> Bandingkan kualifikasi pendidikan, IPK, dan pengalamanmu dengan syarat formasi. Formasi yang syarat khususnya paling sedikit adalah yang peluang lolos administrasinya paling besar.</li>
<li><strong>Perhatikan rasio pelamar.</strong> Formasi populer di kota besar bisa diperebutkan ribuan orang untuk belasan kursi. Formasi di daerah atau unit kerja yang kurang dilirik sering punya rasio jauh lebih bersahabat.</li>
<li><strong>Jangan kejar formasi di luar kompetensimu.</strong> Syarat khusus seperti sertifikat bahasa atau pengalaman kerja tidak bisa dipenuhi dadakan. Pilih yang memang sesuai dengan apa yang kamu miliki sekarang.</li>
<li><strong>Siapkan rencana cadangan.</strong> Jika tahun ini belum lolos, pengalaman mengikuti seluruh tahapan (terutama SKD) adalah modal besar untuk seleksi berikutnya.</li>
</ol>
<h2>Tahapan Seleksi Setelah Pendaftaran</h2>
<p>Memahami alurnya membantumu menyusun strategi belajar:</p>
<ol>
<li><strong>Seleksi administrasi.</strong> Verifikasi dokumen dan syarat. Lolos tahap ini syarat mutlak untuk ikut tes.</li>
<li><strong>Seleksi Kompetensi Dasar (SKD)</strong> dengan sistem CAT BKN, terdiri dari TWK (Tes Wawasan Kebangsaan), TIU (Tes Intelegensia Umum), dan TKP (Tes Karakteristik Pribadi). Ada nilai ambang batas (passing grade) tiap subtes.</li>
<li><strong>Seleksi Kompetensi Bidang (SKB).</strong> Materi sesuai jabatan yang dilamar, bisa berupa tes tertulis, praktik, atau wawancara, tergantung instansi.</li>
<li><strong>Pengumuman dan pemberkasan.</strong> Peserta yang lolos mengikuti pemberkasan untuk penetapan NIP.</li>
</ol>
<p>Untuk latihan, BKN menyediakan portal latihan soal CAT di cat.bkn.go.id. Mulai kerjakan soal TWK, TIU, dan TKP dari sekarang. Bagi waktu belajarmu: TWK butuh pemahaman wawasan kebangsaan (Pancasila, UUD 1945, sejarah nasional), TIU butuh latihan <a href="https://ramzilhuda.com/logika-proposisi-matematika-diskrit/">logika</a> numerik dan verbal yang diulang sampai cepat, sedangkan TKP menilai karakter lewat skenario dan tidak ada jawaban yang sepenuhnya salah. Kerjakan tryout dengan timer agar terbiasa dengan tekanan waktu ujian sesungguhnya.</p>
<h2>FAQ Pendaftaran CPNS 2026</h2>
<p><strong>1. Kapan pendaftaran CPNS 2026 dibuka?</strong><br />
Per Oktober 2026, BKN belum mengumumkan jadwal resmi pendaftaran CPNS umum 2026. Pantau portal SSCASN (sscasn.bkn.go.id) dan kanal resmi BKN. Jangan percaya jadwal yang tidak bersumber dari kanal resmi.</p>
<p><strong>2. Apakah fresh graduate bisa mendaftar CPNS 2026?</strong><br />
Bisa. Lulusan baru justru menjadi salah satu prioritas dalam rekrutmen ASN. Pastikan ijazah dan transkripmu sudah terbit dan sesuai dengan kualifikasi formasi yang diincar.</p>
<p><strong>3. Berapa biaya pendaftaran CPNS?</strong><br />
Gratis. Seluruh tahapan rekrutmen CPNS resmi tidak dipungut biaya apa pun. Jika ada pihak yang meminta bayaran dengan dalih pendaftaran atau kelulusan, itu penipuan.</p>
<p><strong>4. Dokumen apa yang paling sering menggugurkan pelamar di seleksi administrasi?</strong><br />
Ketidaksesuaian data antara KTP, KK, dan ijazah (beda ejaan nama atau tanggal lahir), pas foto yang tidak sesuai ketentuan, serta dokumen pendukung formasi khusus yang tidak lengkap. Rapikan semuanya dari sekarang.</p>
<p><strong>5. Di mana saya bisa latihan soal SKD resmi?</strong><br />
BKN menyediakan portal latihan di cat.bkn.go.id dengan materi TWK, TIU, dan TKP. Manfaatkan juga pengumuman resmi BKN dan KemenPAN-RB sebagai satu-satunya sumber informasi jadwal dan formasi.</p>
<p><strong>6. Apakah boleh mendaftar lebih dari satu formasi sekaligus?</strong><br />
Tidak. Aturannya tegas: satu pelamar hanya boleh memilih satu formasi di satu instansi dalam satu periode pendaftaran. Sistem SSCASN akan menolak jika kamu mencoba membuat pendaftaran ganda. Karena itu strategi memilih formasi menjadi krusial, pelajari rasio pelamar dan formasi tahun sebelumnya sebelum mengunci pilihanmu.</p>
<h2>Kesimpulan</h2>
<p>Pendaftaran CPNS 2026 memang belum dibuka per Oktober 2026, tetapi itu bukan alasan untuk menunggu tanpa persiapan. Yang bisa kamu kerjakan sekarang: merapikan data kependudukan, menyiapkan dan memindai semua dokumen, memastikan email serta nomor HP aktif, dan mulai latihan soal SKD di portal CAT BKN. Sambil menunggu, tetap waspada terhadap hoaks dan jangan pernah membayar untuk urusan pendaftaran.</p>
<p>Pola persiapan seperti ini, menyiapkan dokumen resmi jauh sebelum dibutuhkan, berlaku juga untuk urusan administrasi lainnya. Baca juga panduan <a href="https://ramzilhuda.com/cara-cek-bsu-bpjs-ketenagakerjaan-2026/">Cara Cek BSU BPJS Ketenagakerjaan 2026</a> di blog ini untuk memahami cara memantau status program pemerintah secara online lewat HP.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramzilhuda.com/pendaftaran-cpns-2026-syarat-cara-daftar/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1386</post-id>	</item>
	</channel>
</rss>
