31 Mar 2026 • Admin KhalimZone
Tips CI4 Yang Jarang Diketahui
7 Tips CodeIgniter 4 yang Jarang Diketahui — Tapi Bikin Kode Kamu Jauh Lebih Rapi
Udah bisa setup CI4 dan bikin CRUD dasar? Bagus. Tapi banyak developer — bahkan yang udah lama pakai CI4 — masih sering skip fitur-fitur yang sebenernya bisa bikin kode mereka jauh lebih clean dan efisien.
Ini 7 tips yang gue temuin pas ngembangin project CI4, yang jarang banget dibahas di tutorial-tutorial biasa.
php spark buat generate file otomatis
Kebanyakan developer CI4 bikin Controller, Model, dan Migration secara manual. Padahal CI4 punya Spark CLI yang bisa generate semuanya dalam hitungan detik.
# Generate Controller
php spark make:controller NamaController
# Generate Model
php spark make:model NamaModel
# Generate Migration
php spark make:migration CreateNamaTable
# Generate semuanya sekaligus
php spark make:controller NamaController --restful
Flag --restful langsung generate Controller dengan method index, show, create, update, dan delete yang siap diisi.
$this->validate() langsung di Controller
Banyak yang masih validasi form pakai cara manual. CI4 punya validation built-in yang bisa dipanggil langsung dari Controller — lebih clean dan mudah dibaca.
public function store()
{
if (!$this->validate([
'nama' => 'required|min_length[3]',
'email' => 'required|valid_email|is_unique[users.email]',
'umur' => 'required|integer|greater_than[17]',
])) {
return redirect()->back()->withInput()->with('errors', $this->validator->getErrors());
}
// lanjut proses simpan data
}
Rule is_unique[users.email] langsung ngecek ke database apakah email sudah terdaftar. Praktis banget buat registrasi user.
$allowedFields di Model buat keamanan
Kalau kamu langsung passing $_POST ke Model tanpa filter, itu rawan mass assignment attack. Selalu define $allowedFields di Model kamu.
class UserModel extends Model
{
protected $table = 'users';
protected $primaryKey = 'id';
// Hanya field ini yang boleh diisi via insert/update
protected $allowedFields = [
'nama', 'email', 'password', 'role'
];
// Otomatis isi created_at & updated_at
protected $useTimestamps = true;
}
Dengan ini, field seperti is_admin atau balance yang tidak ada di $allowedFields otomatis diabaikan meski dikirim via form.
Pola yang sering gue liat: developer ngecek session()->get('user') di awal setiap method Controller. Ini redundant. Pakai Filter CI4 buat handle auth di satu tempat.
class AuthFilter implements FilterInterface
{
public function before(RequestInterface $request, $arguments = null)
{
if (!session()->get('user_id')) {
return redirect()->to('/login');
}
}
}
Daftarin di app/Config/Filters.php, terus assign ke route yang butuh auth:
$routes->group('dashboard', ['filter' => 'auth'], function($routes) {
$routes->get('/', 'Dashboard::index');
$routes->get('profile', 'Dashboard::profile');
});
helper() global buat fungsi yang sering dipakai
Kalau ada fungsi yang sering dipanggil di mana-mana — misalnya format tanggal, rupiah, atau generate kode unik — jangan duplikat. Buat helper sendiri.
if (!function_exists('rupiah')) {
function rupiah($angka): string
{
return 'Rp ' . number_format($angka, 0, ',', '.');
}
}
Load helper-nya di BaseController atau autoload via app/Config/Autoload.php supaya langsung tersedia di semua tempat tanpa perlu load manual tiap Controller.
public $helpers = ['format'];
CI_ENVIRONMENT = development buat debug lebih mudah
Kalau kamu dapet error tapi halamannya cuma blank putih, besar kemungkinan environment kamu masih production. Pastiin file .env kamu udah set ke development.
CI_ENVIRONMENT = development
Jangan lupa ganti ke production sebelum deploy ke server live. Mode development menampilkan detail error yang tidak aman untuk dilihat publik.
Di mode development, CI4 akan tampilkan stack trace lengkap, query yang dijalankan, dan info debug lainnya langsung di browser.
$db->getLastQuery() buat debug query SQL
Sering bingung kenapa data yang ditarik dari database gak sesuai ekspektasi? Tampilin query yang beneran dijalankan CI4 langsung di browser.
$db = db_connect();
$result = $db->table('users')
->where('status', 'active')
->get();
// Tampilin query yang baru aja dijalankan
dd((string) $db->getLastQuery());
Fungsi dd() (dump and die) adalah helper bawaan CI4 — langsung print variabel dengan format yang readable dan stop eksekusi. Jauh lebih praktis dari var_dump() + die().
7 tips ini sebenernya fitur bawaan CI4 yang udah ada dari sananya — cuma jarang dieksplor. Coba terapin satu per satu di project kamu dan rasain bedanya: kode lebih clean, lebih aman, dan lebih gampang di-maintain. Di artikel berikutnya gue bakal bahas cara bikin REST API di CI4 dari nol — stay tuned!