Fitur hook yang disediakan pada CodeIgniter sebenarnya memungkinkan kita untuk sedikit melakukan hack pada proses yang berjalan pada aplikasi yang kita buat, tanpa harus mengubah skrip pada file inti CodeIgniter. Misalnya saja, kita ingin membuat sebuah log untuk menyimpan data URL apa saja yang diakses oleh pengguna, mendata setiap pengunjung yang mengakses halaman, dll. Dalam kasus dibawah ini kita akan menggunakan fitur hook untuk mengatur konfigurasi aplikasi berdasarkan konfigurasi yang kita simpan di database.

Langkah-langkahnya adalah sebagai berikut:

  1. Membuat tabel app_config untuk menyimpan konfigurasi aplikasi kita
    CREATE TABLE IF NOT EXISTS `app_config` (
      `key` varchar(255) NOT NULL,
      `value` varchar(255) NOT NULL,
      PRIMARY KEY (`key`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
  2. Memasukkan data konfigurasi awal kedalam tabel yang telah kita buat
    INSERT INTO `app_config` (`key`, `value`) VALUES
      ('address', 'Griya Wilis Indah'),
      ('company', 'Belva Tekindo'),
      ('email', ''),
      ('fax', ''),
      ('language', 'indonesia'),
      ('phone', ''),
      ('timezone', 'Asia/Bangkok'),
      ('version', '1.0');
    
  3. Membuat file application/models/m_appconfig.php untuk mengakses tabel yang telah kita buat
    <?php
    class M_appconfig extends CI_Model
    {	
    	function get_all()
    	{
    		$this->db->from('app_config');
    		$this->db->order_by("key", "asc");
    		return $this->db->get();		
    	}
    }
    
    /* End of file m_appconfig.php */
    /* Location: ./application/models/m_appconfig.php */
    
  4. Menambahkan model M_appconfig pada file application/config/autoload.php agar di load otomatis
    $autoload['model'] = array('M_appconfig');
    
  5. Membuat file application/hooks/load_config.php
    <?php
    function load_config()
    {
    	$CI =& get_instance();
    	
    	//Memuat konfigurasi dari database kefalam konfigurasi global CI
    	foreach($CI->M_appconfig->get_all()->result() as $app_config)
    	{
    		$CI->config->set_item($app_config->key,$app_config->value);
    	}
    	
    	//Set konfigurasi timezone CI dengan konfigurasi dari database
    	if ($CI->config->item('timezone'))
    	{
    		date_default_timezone_set($CI->config->item('timezone'));
    	}	
    }
    
    /* End of file load_config.php */
    /* Location: ./application/hooks/load_config.php */
    
  6. Mengaktifkan fitur ini pada file application/config/config.php seperti berikut:
    $config['enable_hooks'] = TRUE ;
    
  7. Mendefinisikan hook yang akan digunakan pada saat aplikasi kita dijalankan. Buka file application/config/hooks.php untuk menambah hook baru.
    $hook['post_controller_constructor'] = array(
                                    'class'    => '',
                                    'function' => 'load_config',
                                    'filename' => 'load_config.php',
                                    'filepath' => 'hooks'
                                    );
    
Berikut ini merupakan hal yang harus diperhatikan dalam pembuatan hook. Yaitu poin dimana hook akan dijalankan. Terdapat tujuh poin dimana hook akan kita tempatkan, pada contoh diatas hook ditempatkan pada poin post_controller_constructor. Berikut penjelasan ketujuh poin tersebut.
  • pre_system
    Kelas dan metode hook kita akan dijalankan sebelum sistem dieksekusi. Berdasar dokumentasi CodeIgniter, hanya kelas Benchmark dan Hook yang dijalankan pada poin ini.
  • pre_controller
    Kelas dan metode hook akan dijalankan sebelum controller kita dipanggil. Semua base class, routing dan security sudah dipanggil pada poin ini.
  • post_controller_constructor
    Akan dipanggil ketika konstruktor controller dijalankan, tapi sebelum metode controller dipanggil.
  • post_controller
    Akan dipanggil ketika controller sudah benar-benar dijalankan.
  • display_override
    Memungkinkan kita untuk menentukan metodologi display sesuai dengan keinginan kita.
  • cache_override
    Mengijinkan kita untuk menampilkan mekanisme cache sesuai dengan keinginan kita.
  • post_system
    Dijalankan ketika halaman berhasil dikirim ke browser.