Peta CodeIgniter 3 → Astro
Sebagian besar yang kamu tahu dari CI3 punya padanan langsung di Astro. Yang tidak punya padanan justru bagian yang paling perlu kamu ketahui sebelum mulai.
Intisari
- Controller → berkas halaman. Method controller → tidak ada padanannya; tiap URL adalah berkas sendiri.
- Model CI3 → fungsi biasa di
src/lib/. Tidak ada kelas dasar, tidak ada$this->dbajaib. $this->input->post()→ Astro Actions dengan validasi Zod. Ini peningkatan keamanan, bukan sekadar sintaks baru.- Hook
pre_controller→src/middleware.ts, dan ia jauh lebih mudah ditelusuri. - Yang hilang dan sebaiknya tetap hilang: autoload global,
$this->sessionyang selalu aktif, dan helper yang tersedia di mana-mana tanpa di-import.
Peta konsep
| CodeIgniter 3 | Astro | Catatan |
|---|---|---|
application/controllers/Berita.php |
src/pages/berita/[slug].astro |
Tidak ada kelas controller. URL ditentukan oleh letak berkas. |
public function detail($id) |
— tidak ada padanan — | Satu method = satu berkas. Terasa banyak berkas, tapi menghapus seluruh kelas bug routing. |
application/models/Berita_model.php |
src/lib/artikel.ts |
Fungsi biasa yang di-export. Tidak ada extends CI_Model. |
application/views/berita/detail.php |
src/layouts/ + src/components/ |
Terbagi jadi layout (kerangka) dan komponen (potongan). |
application/config/routes.php |
Nama berkas, plus redirects di config |
Rute kustom jadi jarang. Yang tetap perlu adalah redirect dari URL lama (Fase 9). |
application/config/config.php |
astro.config.mjs + astro:env |
Rahasia tidak lagi di berkas yang di-commit (Fase 7). |
Hook pre_controller |
src/middleware.ts |
Satu berkas, urutan jelas, bisa dibaca dari atas ke bawah. |
$this->db->select()->where()->get() |
db.selectFrom().where().execute() |
Kysely. Bentuknya nyaris identik — tapi bertipe (Fase 2). |
$this->input->post('judul') |
Astro Actions + Zod | Validasi jadi bagian dari deklarasi, bukan if yang bisa lupa ditulis. |
$this->session->userdata('id') |
Astro.locals.member |
Diisi middleware, bertipe, dan hanya di halaman on-demand. |
$this->load->helper('url') |
import { … } from "@/lib/url" |
Tidak ada yang tersedia begitu saja. Semua ketergantungan terlihat di bagian atas berkas. |
redirect('/berita') |
return Astro.redirect("/berita") |
return-nya wajib. Tanpa itu, kode di bawahnya tetap jalan. |
show_404() |
return Astro.rewrite("/404") atau status 404 |
rewrite mempertahankan URL; redirect mengubahnya. |
Contoh berdampingan
CodeIgniter 3
class Berita extends CI_Controller {
public function detail($slug)
{
$this->load->model('berita_model');
$artikel = $this->berita_model->ambil_by_slug($slug);
if (!$artikel) {
show_404();
}
$data['artikel'] = $artikel;
$data['terkait'] = $this->berita_model->terkait($artikel->kategori_id, 5);
$this->load->view('header', $data);
$this->load->view('berita/detail', $data);
$this->load->view('footer');
}
}
Astro
---
// src/pages/berita/[slug].astro
import Layout from "@/layouts/Artikel.astro";
import DaftarTerkait from "@/components/DaftarTerkait.astro";
import { ambilArtikelPublik, ambilTerkait } from "@/lib/artikel";
const { slug } = Astro.params;
const artikel = await ambilArtikelPublik(slug!);
if (!artikel) {
return Astro.rewrite("/404");
}
const terkait = await ambilTerkait(artikel.kategoriId, 5);
---
<Layout judul={artikel.judul}>
<h1>{artikel.judul}</h1>
<div class="badan-artikel" set:html={artikel.isi} />
<DaftarTerkait artikel={terkait} />
</Layout>
Tiga perbedaan yang layak diperhatikan:
- Tidak ada
$data. Variabel di frontmatter langsung terlihat di template. Tidak ada lagiUndefined variable: artikelkarena lupa memasukkannya ke array. - Header dan footer tidak dimuat terpisah.
<Layout>membungkus. Mustahil menghasilkan halaman tanpa penutup</body>karena lupa memanggil view footer. return Astro.rewrite, bukanshow_404(). Di CI3,show_404()menghentikan eksekusi lewatexit. Di Astro kamu harusreturn— kalau lupa, kode di bawahnya tetap berjalan dan kemungkinan besar meledak saat membacaartikel.kategoriIddarinull.
Empat hal yang sengaja tidak punya padanan
| Hilang | Kenapa itu bagus |
|---|---|
| Autoload library & helper | Di CI3 kamu tidak pernah tahu apa yang sudah termuat. Di Astro tiap ketergantungan tertulis di bagian atas berkas — dan yang tidak dipakai tidak ikut ke bundel. |
| Sesi yang selalu aktif | Ini yang memblokir cache HTML-mu sekarang. session_start() di tiap request mengirim Set-Cookie, dan Cloudflare tidak akan meng-cache respons seperti itu. Di Astro sesi dibaca hanya saat dibutuhkan. |
$this yang bisa apa saja |
Tidak ada objek dewa. Fungsi menerima apa yang dibutuhkannya, jadi bisa diuji tanpa membangunkan seluruh framework. |
| Query Builder yang menerima string apa pun | Kysely tidak bisa menerima nama tabel yang tidak ada di skema. Salah ketik nama kolom gagal saat astro check, bukan sebagai error MySQL di produksi. |
Baris kedua itu inti seluruh proyek migrasi ini. Portalmu melayani 1,25 juta request per jam, 500 ribu di antaranya sampai ke origin — cache hit ratio sekitar 60%, dan itu hampir seluruhnya aset, bukan HTML. Penyebabnya struktural: CI3 memulai sesi untuk semua orang, termasuk pembaca anonim yang hanya ingin membaca satu artikel. Astro tidak memaksamu melakukan itu, dan itulah sumber perbaikan terbesarnya — bukan kecepatan bahasanya.
Yang tetap sama
Supaya seimbang: database-mu tidak berubah, skema tabelmu tidak berubah, dan logika bisnismu sebagian besar berpindah apa adanya. Migrasi ini bukan penulisan ulang produk — ia penggantian lapisan penyajian dan lapisan akses data. Fase 9 membahas cara melakukannya tanpa mematikan situs lama satu hari pun.
Latihan: ambil satu controller CI3-mu yang paling sering diakses — kemungkinan besar
controller detail berita. Tulis ulang peta-nya di kertas atau berkas teks: tiap method jadi
berkas apa, tiap load->model jadi fungsi apa di src/lib/, dan tiap
load->view jadi layout atau komponen apa. Belum perlu menulis kodenya. Catat juga
berapa banyak method di controller itu yang ternyata tidak punya URL sendiri — itu kandidat fungsi
lib/, bukan halaman.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.