Ngab, Gaspol Yuk! Kupas Tuntas Controller CodeIgniter Biar Data Auto Aman dan Terkelola Cantik!

Mengelola Data dengan Controller di CodeIgniter | CRUD Lengkap

PPLG

PPLG

Penulis

08 Aug 2026
40 x dilihat

Halo gaes! Apa kabar? Semoga vibes ngoding kalian lagi on fire ya! Hari ini, kita mau spill satu topik yang worth it banget buat dibahas kalau lagi main-main sama CodeIgniter, yaitu gimana sih Controller bisa jadi juru kunci andalan buat ngelola data di aplikasi kita. Ini bukan cuma soal nampilin doang lho, tapi gimana caranya data bisa masuk, diupdate, bahkan dihapus dengan santuy tapi tetap powerful. Skuy, gaspol!

Controller: Juru Kunci Pintu Gerbang Datamu

Bayangin gini, aplikasi kamu itu kayak rumah gede. Nah, Controller ini adalah resepsionis atau satpam di pintu gerbang utama. Semua request yang masuk (misal, user mau liat daftar produk, mau nambahin produk baru, atau mau ngedit info produk) itu pasti lewat si Controller ini dulu.

Tugas si Controller itu apa aja sih?

  • Menerima Request: Dia dengerin apa maunya user.
  • Ngomong Sama Model: Kalau requestnya butuh data (misal, "tolong tampilin semua produk dong"), Controller akan nyuruh Model buat nyariin data di database. Model ini ibarat database manager-nya.
  • Ngomong Sama View: Setelah data didapat, Controller akan kirimin data itu ke View. View ini ibarat desainer interior yang tugasnya nampilin data biar cakep di mata user.
  • Memproses Logika: Di sini juga Controller mutusin, kalau data masuk, perlu divalidasi nggak? Kalau mau update, data mana yang diupdate?

Pokoknya, Controller ini yang paling sibuk ngatur lalu lintas data antara user (lewat request), database (lewat Model), dan tampilan (lewat View). Ini dia inti dari konsep MVC (Model-View-Controller) yang bikin ngoding kita jadi lebih rapi dan gampang di-maintenance.

Ngatur Data ala Controller: CRUD itu EZ Peasy!

Kita bakal bahas gimana Controller ngelakuin operasi CRUD (Create, Read, Update, Delete) yang udah jadi menu wajib di tiap aplikasi. Kita pake contoh sederhana ya, misal kita mau ngelola data Produk.

Preparasi Awal (Minimalis biar Cepet Paham): Sebelum ngoding, pastiin kamu udah punya instalasi CodeIgniter (kita pake CI4 ya, biar kekinian). Anggaplah kita udah punya table products di database dengan kolom id, name, price, stock. Terus, kita bikin ProdukModel.php sederhana di app/Models/ (kalau belum ada, bikin ya):

<?php namespace App\Models;

use CodeIgniter\Model;

class ProdukModel extends Model
{
    protected $table      = 'products';
    protected $primaryKey = 'id';

    protected $useAutoIncrement = true;

    protected $returnType     = 'array'; // Atau 'object'
    protected $useSoftDeletes = false; // Kalau gak pake soft delete

    protected $allowedFields = ['name', 'price', 'stock'];

    protected $useTimestamps = false; // Kalau gak pake created_at/updated_at
    // protected $createdField  = 'created_at';
    // protected $updatedField  = 'updated_at';
    // protected $deletedField  = 'deleted_at';

    // protected $validationRules    = [];
    // protected $validationMessages = [];
    // protected $skipValidation     = false;
}

Sekarang, fokus ke Controller-nya! Skuy bikin Controller Produk.php di app/Controllers/.

<?php namespace App\Controllers;

use App\Models\ProdukModel;
use CodeIgniter\Controller;

class Produk extends Controller
{
    protected $produkModel;

    public function __construct()
    {
        $this->produkModel = new ProdukModel();
    }

    // --- 1. Nampilin Data (READ) ---
    public function index()
    {
        $data = [
            'title' => 'Daftar Produk Kece Badai',
            'products' => $this->produkModel->findAll() // Ngambil semua data produk
        ];

        return view('produk/index', $data); // Kirim data ke View
    }

    // --- 2. Nambah Data (CREATE) ---
    public function tambah()
    {
        // Tampil form tambah produk
        $data = ['title' => 'Tambah Produk Baru, Gaspol!'];
        return view('produk/tambah', $data);
    }

    public function simpan()
    {
        // Validasi input dulu, gaes! Penting banget ini!
        if (!$this->validate([
            'name' => [
                'rules' => 'required|min_length[3]|max_length[255]',
                'errors' => [
                    'required' => '{field} harus diisi, ngab!',
                    'min_length' => '{field} minimal 3 karakter.',
                    'max_length' => '{field} kebanyakan, maksimal 255 karakter.'
                ]
            ],
            'price' => [
                'rules' => 'required|numeric',
                'errors' => [
                    'required' => '{field} wajib diisi.',
                    'numeric' => '{field} harus angka, ngab!'
                ]
            ],
            'stock' => [
                'rules' => 'required|numeric',
                'errors' => [
                    'required' => '{field} jangan kosong.',
                    'numeric' => '{field} harus angka, bro!'
                ]
            ]
        ])) {
            // Kalau validasi gagal, balikin ke form dengan error messages
            session()->setFlashdata('errors', $this->validator->getErrors());
            return redirect()->back()->withInput();
        }

        // Kalau validasi sukses, baru deh kirim ke Model
        $this->produkModel->save([
            'name' => $this->request->getPost('name'),
            'price' => $this->request->getPost('price'),
            'stock' => $this->request->getPost('stock')
        ]);

        session()->setFlashdata('message', 'Data produk berhasil ditambahkan, mantul!');
        return redirect()->to('/produk'); // Redirect balik ke daftar produk
    }

    // --- 3. Ngedit Data (UPDATE) ---
    public function edit($id = null)
    {
        $product = $this->produkModel->find($id);

        if (empty($product)) {
            throw new \CodeIgniter\Exceptions\PageNotFoundException('Produk dengan ID ' . $id . ' tidak ditemukan, ngab!');
        }

        $data = [
            'title' => 'Edit Produk Kekinian',
            'product' => $product // Kirim data produk yang mau diedit
        ];

        return view('produk/edit', $data);
    }

    public function update($id)
    {
        // Validasi lagi, gaes!
        if (!$this->validate([
            'name' => [
                'rules' => 'required|min_length[3]|max_length[255]',
                'errors' => [
                    'required' => '{field} kudu diisi!',
                ]
            ],
            'price' => [
                'rules' => 'required|numeric',
                'errors' => [
                    'required' => '{field} wajib diisi.',
                ]
            ],
            'stock' => [
                'rules' => 'required|numeric',
                'errors' => [
                    'required' => '{field} jangan kosong.',
                ]
            ]
        ])) {
            session()->setFlashdata('errors', $this->validator->getErrors());
            return redirect()->back()->withInput();
        }

        // Update data produk
        $this->produkModel->update($id, [
            'name' => $this->request->getPost('name'),
            'price' => $this->request->getPost('price'),
            'stock' => $this->request->getPost('stock')
        ]);

        session()->setFlashdata('message', 'Data produk berhasil diupdate, auto kece!');
        return redirect()->to('/produk');
    }

    // --- 4. Nghapus Data (DELETE) ---
    public function hapus($id)
    {
        // Pastiin produknya ada
        $product = $this->produkModel->find($id);

        if (empty($product)) {
            session()->setFlashdata('error', 'Produk tidak ditemukan, gagal dihapus!');
            return redirect()->to('/produk');
        }

        $this->produkModel->delete($id);
        session()->setFlashdata('message', 'Produk berhasil dihapus, bye bye!');
        return redirect()->to('/produk');
    }
}

Penjelasan Singkat Code di Atas:

  • __construct(): Ini auto jalan pas Controller dipanggil. Kita inisiasi ProdukModel di sini biar bisa dipake di semua method.
  • index(): Method default buat nampilin semua produk. Dia manggil findAll() dari Model, terus datanya dikirim ke produk/index view.
  • tambah() & simpan(): Method tambah() cuma nampilin form kosong buat input data. Nah, simpan() ini yang core! Dia ngambil data dari form ($this->request->getPost()), ngevalidasi pake $this->validate(), baru deh kalau lolos validasi, dia nyimpen ke database lewat $this->produkModel->save(). Kalau gagal, dia balikin ke form sambil ngasih tau errornya (session()->setFlashdata).
  • edit($id) & update($id): Mirip kayak tambah/simpan. edit($id) ngambil data produk berdasarkan ID-nya, terus nampilin di form edit. update($id) yang bakal ngeproses data form yang udah diedit, ngevalidasi, terus nge-update ke database pake $this->produkModel->update($id, data_baru).
  • hapus($id): Ini paling simple. Cukup panggil $this->produkModel->delete($id) dan beres. Tapi selalu penting buat ngecek dulu data yang mau dihapus itu beneran ada atau nggak.

Routing (bikin jalan pintasnya): Supaya Controller ini bisa diakses, kita perlu atur routing di app/Config/Routes.php.

$routes->get('/', 'Produk::index'); // Halaman utama nampilin produk
$routes->get('/produk', 'Produk::index');
$routes->get('/produk/tambah', 'Produk::tambah');
$routes->post('/produk/simpan', 'Produk::simpan');
$routes->get('/produk/edit/(:num)', 'Produk::edit/$1'); // (:num) artinya angka
$routes->post('/produk/update/(:num)', 'Produk::update/$1');
$routes->get('/produk/hapus/(:num)', 'Produk::hapus/$1');

Contoh View (produk/index.php, produk/tambah.php, produk/edit.php): (Untuk mempersingkat, saya tidak akan sertakan kode view lengkap di sini. Tapi intinya, view ini akan menampilkan $products untuk index, form untuk tambah dan edit.)

  • produk/index.php: Bakal looping $products buat nampilin tabel.
  • produk/tambah.php: Bakal ada form dengan input name, price, stock, dengan action ke /produk/simpan.
  • produk/edit.php: Bakal ada form yang mirip tambah.php, tapi inputnya udah terisi data dari $product yang dikirim controller, dan actionnya ke /produk/update/ID_PRODUK.

Tips Praktis Biar Controller Kamu Auto Kece!

  1. Validasi itu WAJIB BANGET! Jangan pernah percaya input dari user. Selalu validasi di Controller. CI punya fitur validasi yang powerful, pake itu! Ini penting buat keamanan dan integritas data.
  2. Sanitasi Input: Selain validasi, bersihin juga input dari user. Hindari serangan XSS (Cross-Site Scripting) atau SQL Injection. CI punya esc() atau strip_tags() helper yang bisa kamu manfaatkan.
  3. Flash Messages: Pake session()->setFlashdata() buat ngasih notifikasi ke user (misal: "Produk berhasil ditambahkan!"). Ini bikin UX jadi lebih smooth.
  4. Helper URL: Gunakan base_url() atau site_url() saat bikin link di view atau redirect di controller. Ini bikin aplikasi kamu lebih fleksibel kalau URL base-nya berubah.
  5. Satu Resource, Satu Controller (Idealnya): Untuk CRUD sebuah entitas (misal Produk), sebaiknya punya satu Controller khusus (Produk.php) daripada digabung-gabung. Ini bikin kode lebih rapi.
  6. Error Handling: Antisipasi kalau ada data yang nggak ditemukan atau error lain. Jangan sampai aplikasi kamu "nge-bug" di depan user. Kasih pesan error yang informatif.

Kesimpulan: Controller Bukan Kaleng-kaleng!

Nah, gaes, dari sini udah jelas kan kalau Controller itu bukan cuma numpang lewat. Dia adalah otak utama yang ngatur semua interaksi data di aplikasi CodeIgniter kita. Dengan nguasain cara kerja Controller dalam ngelola data (CRUD), kamu udah punya bekal mantul buat bikin aplikasi yang robust dan reliable.

Ingat, kunci utamanya adalah praktik! Jangan cuma baca doang. Skuy, langsung coba bikin aplikasi sederhana sendiri. Auto jago deh! Kalau ada pertanyaan, jangan sungkan ya. Semangat ngodingnya, ngab!


5.0

Berikan Rating

Komentar (0)

Silakan login untuk memberikan komentar.

Login Sekarang

Belum ada komentar. Jadilah yang pertama!

Menyukai Artikel (2)