Memanfaatkan helper bawaan url, form, html, dan text, lalu membuat custom helper dan custom library, mendaftarkannya sebagai service, dan mengatur autoload agar kode tetap DRY di seluruh aplikasi.

Jika kalian memperhatikan series ini, banyak kode yang berulang: site_url() untuk membuat link, esc() untuk amankan output, form_open() untuk form yang aman CSRF. Kode berulang adalah sumber bug dan sulit dipelihara.
Di episode 10 ini kita merapikannya dengan dua mekanisme CodeIgniter: helpers (fungsi bebas untuk tugas umum) dan libraries (class untuk logika kompleks). Kalian akan belajar memakai helper bawaan, membuat helper custom, membangun library custom, dan mendaftarkannya sebagai service.
Helper adalah kumpulan fungsi yang dimuat sesuai kebutuhan. CodeIgniter 4 punya banyak helper siap pakai:
| Helper | Fungsi utama |
|---|---|
url | site_url(), base_url(), anchor(), uri_string() |
form | form_open(), form_input(), form_submit(), set_value() |
html | img(), link_tag(), script_tag() |
text | word_limiter(), highlight_phrase(), ellipsize() |
cookie | set_cookie(), get_cookie(), delete_cookie() |
number | number_to_currency(), number_to_roman() |
date | now(), timezone_select() |
filesystem | directory_map(), write_file(), delete_files() |
string | random_string(), increment_string() |
array | array_group_by(), array_flatten() |
security | sanitize_filename(), strip_image_tags() |
helper('url'); // di controller/method
helper(['form', 'html']); // beberapa sekaligus
$this->helpers = ['url']; // di BaseController (auto-load)Pendekatan yang kami rekomendasikan: daftarkan helper yang hampir selalu dipakai di $helpers BaseController (seperti url dan form), lalu panggil helper('...') untuk helper khusus di tempat yang membutuhkannya.
helper(['url', 'text']);
echo site_url('posts'); // http://localhost:8080/posts
echo anchor('posts', 'Daftar Post');
$excerpt = word_limiter($post['body'], 30);Fungsi yang dipakai di banyak tempat dan tidak butuh state → custom helper. Buat app/Helpers/app_helper.php:
<?php
if (! function_exists('format_rupiah')) {
function format_rupiah(int $amount): string
{
return 'Rp ' . number_format($amount, 0, ',', '.');
}
}
if (! function_exists('humanize_date')) {
function humanize_date(string $date): string
{
return date('d M Y', strtotime($date));
}
}Cara memakainya:
helper('app'); // nama file tanpa prefix
echo format_rupiah(1500000); // Rp 1.500.000
echo humanize_date('2026-08-16'); // 16 Agu 2026Tip
Bungkus tiap fungsi dengan if (! function_exists(...)) agar aman jika helper dimuat dua kali. Ini pola standar di semua helper CodeIgniter dan mencegah error "cannot redeclare function".
Logika yang lebih kompleks, menyimpan state, atau punya banyak method → library. Buat library untuk membuat slug:
<?php
namespace App\Libraries;
class Slugger
{
public function make(string $text): string
{
$text = strtolower($text);
$text = preg_replace('/[^a-z0-9]+/', '-', $text);
return trim($text, '-');
}
}Pemakaian sederhana:
$slugger = new \App\Libraries\Slugger();
echo $slugger->make('Belajar CodeIgniter 4'); // belajar-codeigniter-4Agar library diinstansiasi sekali dan mudah diakses dari mana pun, daftarkan sebagai service di app/Config/Services.php:
<?php
namespace Config;
use CodeIgniter\Config\BaseService;
use App\Libraries\Slugger;
class Services extends BaseService
{
public static function slugger(bool $getShared = true): Slugger
{
if ($getShared) {
return static::getSharedInstance('slugger');
}
return new Slugger();
}
}Pemakaian:
$slug = \Config\Services::slugger()->make($title);$getShared = true (default) membuat instance yang sama dibagikan ke seluruh request — efisien untuk library tanpa state antar pemanggilan.
Selain BaseController, kalian bisa memuat resource secara global lewat app/Config/Autoload.php:
public $helpers = ['url', 'form', 'app'];
public $classmap = [
'Slugger' => APPPATH . 'Libraries/Slugger.php',
];$helpers memuat helper global, $classmap memetakan nama class ke file sehingga new Slugger() langsung ditemukan tanpa use. Namun untuk codebase besar, preferensikan service registration daripada classmap — lebih jelas dan teruji.
| Kriteria | Helper | Library |
|---|---|---|
| Bentuk | Fungsi bebas | Class dengan method |
| State | Tidak menyimpan state | Bisa menyimpan state |
| Contoh | site_url(), format_rupiah() | Email, Slugger, Encryption |
| Regenerasi | Bisa dimuat berulang | Biasanya singleton via service |
Aturan praktis: fungsi satu baris yang dipakai di view/controller → helper; logika multi-langkah yang berulang dan butuh konfigurasi → library + service.
app/Helpers/ dengan if (! function_exists(...)).app/Libraries/; daftarkan sebagai service di Config/Services.php.Autoload.php untuk helper global dan classmap.Inti yang harus dibawa pulang:
\Config\Services::slugger()) memberikan singleton yang rapi.Di episode 11 selanjutnya kita akan membahas email & notifications — Email library dengan SMTP, template email HTML, serta praktik reset password lewat email yang mengirim token dan link ke user. Siapkan akun SMTP (misalnya Mailtrap untuk development)!