← Semua pembelajaran / Astro Nol → Portal Berita
Fase 0 · Fondasi: Node, TypeScript & Cara Pikir Astro

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.

Sumber asli codeigniter.com Resmi Rangkuman ~9 menit baca

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->db ajaib.
  • $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->session yang selalu aktif, dan helper yang tersedia di mana-mana tanpa di-import.

Peta konsep

CodeIgniter 3AstroCatatan
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:

  1. Tidak ada $data. Variabel di frontmatter langsung terlihat di template. Tidak ada lagi Undefined variable: artikel karena lupa memasukkannya ke array.
  2. Header dan footer tidak dimuat terpisah. <Layout> membungkus. Mustahil menghasilkan halaman tanpa penutup </body> karena lupa memanggil view footer.
  3. return Astro.rewrite, bukan show_404(). Di CI3, show_404() menghentikan eksekusi lewat exit. Di Astro kamu harus return — kalau lupa, kode di bawahnya tetap berjalan dan kemungkinan besar meledak saat membaca artikel.kategoriId dari null.

Empat hal yang sengaja tidak punya padanan

HilangKenapa 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.