author Ahmad Muhardian

Tutorial Codeigniter #04: Memahami Controller Lebih Dalam


Codeigniter Controller

Pada tutorial sebelumnya, kita sudah belajar tentang konsep MVC dan bagaimana hubungan routes dengan Controller.

Pada tutorial ini, kita akan memahami Controller lebih dalam.

Seperti:

  • Apa tugas utama dari Controller?
  • Bagaimana cara membuat Controller dan aturannya;
  • Membaca input dan membuat output;
  • Fitur-fitur berguna lainnya di Controller.

Mari kita mulai…

Apa tugas utama Controller?

Controller adalah jantungnya aplikasi yang bertugas meng-handle HTTP request. 1

Flowchart aplikasi CI

Coba perhatikan URL berikut:

example.com/index.php/blog/

Jika kita membuka URL tersebut, maka Codeigniter akan mencari Controller bernama Blog. Lalu si Controller Blog akan meng-handle request kita.

Meng-handle dapat kita artikan dengan:

  • Menerima HTTP request;
  • Memprosesnya;
  • Mengirim HTTP response.

Jadi itulah tugas utama dari Controller.

Tapi ada juga yang memberi tugas Controller untuk menentukan logika bisnis.

Saya tidak bilang ini salah, tapi di bagian memproses HTTP request.. kita memang harus memproses sesuai dengan logika bisnis yang ditentukan.

Akan tetapi, menulis semua logika bisnis di dalam Controller akan membuat kode kurang rapi dan sulit di test.

Karena itu, ada juga yang menyarankan:

Sebaiknya logika bisnis ditulis di dalam model atau membuat layer tersendiri seperti pada repository/service pattern.

Aturan Membuat Controller

1. Penulisan nama File

File Controller harus dibuat di dalam folder application/controllers dan penulisan nama filenya harus diawali dengan huruf besar.

✅ Contoh benar:

Blog.php
Product.php

❌ Contoh salah:

blog.php
product.php

Jika nama terdiri dari dua suku kata atau lebih, boleh dipisah dengan underscore.

Contoh:

Pendaftaran_siswa.php

2. Penulisan nama Class

File Controller berisi sebuah class, cara menulis nama class harus diawali dengan huruf kapital. Kalau bisa ikuti nama filenya.

❌ Contoh salah:

<?php
class  blog extends CI_Controller {

}

✅ Contoh yang benar:

<?php
class Blog extends CI_Controller {

}

Jika nama terdiri dari dua suku kata atau lebih, bisa dipisah dengan underscore.

Contoh:

<?php
class Account_info extends CI_Controller {

}

Nanti pada URL akan diakses dengan:

example.com/index.php/account_info/

Atau kita juga bisa membuat aliasnya di config/routes.php.

3. Penulisan nama Method

Nama method ditulis dengan huruf kecil dan jika terdapat lebih dari satu suku kata, bisa dipisah dengan underscore.

Contoh:

<?php
class Blog extends CI_Controller {
  public function index()
  {
    echo 'Hello World!';
  }

  public function comments()
  {
    echo 'Look at this!';
  }
}

4. Folder untuk Controller

Kita juga bisa membuat sub folder di dalam folder application/controllers untuk mengelompokan Controller.

Contoh:

📂 admin/
   📜 Dashboard.php
   📜 Product.php
   📜 Report.php
   📜 Setting.php
📂 member/
   📜 Overview.php
   📜 Transaction.php
   📜 Profile.php

Lalu kita bisa memberikan default route untuk masing-masing folder pada config/routes.php seperti ini:

<?php

$routes['admin'] = 'admin/dashboard';
$routes['admin/product'] = 'admin/product';

Input dan Output di Controller

Pada controller, kita bisa mengambil input dari properti $this->input dan untuk menghasilkan output kita bisa gunakan echo, load->view, dan properti $this->output.

Empat Macam Input Dasar

Ada empat macam yang bisa kita dapatkan di Controller dengan properti $this->input:

  1. $this->input->post() untuk mengambil input dari form yang menggunakan metode POST untuk pengiriman data;
  2. $this->input->get() untuk mengambil input dari query string atau form yang menggunakan metode GET untuk pengiriman data;
  3. $this->input->cookie() untuk mengambil input dari cookie browser;
  4. $this->input->server() untuk mengambil input dari server;

Sebenarnya kita juga bisa memanfaatkan variabel global bawaan PHP seperti $_POST, $_GET, $_COOKIE, dan $_SERVER.

Apa bedanya variabel tersebut dengan $this->input?

Bedanya:

Mengambil input dari $this->input lebih aman, karena sudah di-filter dan diproteksi XSS serta CSRF.

Untuk mempelajari lebih lanjut tentang properti $this->input di Controller, silakan baca di dokumentasinya.

Membuat Output

Output akan menjadi HTTP Response dari request yang diterima oleh Controller.

Kita bisa membuat output dengan fungsi echo(), print(), dan fungsi output lainnya.

Tapi biasanya, kita menampilkan sebuah view dengan fungsi:

$this->load->view('nama_view');

Sebenarnya fungsi tersebut menjalankan perintah echo() juga.

Header untuk Output

Codeigniter menyediakan properti khusus untuk menentukan header dan output tertentu yang kita inginkan.

Misalnya:

Kita ingin membalas sebuah HTTP request dengan file PDF.

Maka kita tinggal set header untuk HTTP response dan mengirim file PDF-nya pada body HTTP response.

Contoh kodenya:

$this->output->set_content_type('pdf')
    ->set_output('dokumen.pdf');

Contoh untuk response JSON:

$data = [
	'nama' => 'petanikode',
	'email' => '[email protected]'
];

$this->output->set_content_type('json')
    ->set_output($data);

Fungsi $this->output dapat kamu pelajari lebih lengkap di dokumentasi Class Output.

Private Method di Controller

Jika kita membuat method pada controller dengan modifier private, maka method tersebut tidak akan bisa diakses dari publik atau URL.

Contoh:

<?php
class Blog extends CI_Controller {
  public function index()
  {
    echo 'Hello World!';
  }

  private function _utility()
  {
    echo 'Look at this!';
  }
}

Coba akses controller tersebut melalui URL:

example.com/index.php/blog/_utility

Maka pasti tidak akan bisa.

Method private biasanya dipakai untuk fungsi tambahan seperti utility dan hanya bisa dipanggil pada class itu sendiri.

Apa bedanya method index() dengan __construct()?

Method index() adalah method yang akan dijalankan secara default saat kita mengakses nama controller.

Contoh:

<?php
class Blog extends CI_Controller {
  public function index()
  {
    echo 'Hello World!';
  }

  public function comment()
  {
    echo 'Look at this!';
  }
}

Maka saat membuka URL:

example.com/index.php/blog/

Method index() yang akan dieksekusi.

Sedangkan method __costruct() adalah method yang akan selalu dieksekusi setiap kita mengakses Controller, entah kita mau akses method apapun.

Biasanya method __construct() digunakan untuk inisialisasi atau persiapan awal.

Contoh:

<?php
class Blog extends CI_Controller {
  public function __construct()
  {
  	parent::__construct();
    $this->load->model('post');
  }
  
  public function index()
  {
    echo 'Hello World!';
  }

  public function comment()
  {
    echo 'Look at this!';
  }
}

Pada contoh tersebut, kita melakukan load model pada method __construct(), ini akan membuat model post di-load otomatis pada Controller Blog.

Menjalankan Controller dari CLI

Selain di akses melalui URL, Controller bisa juga kita jalankan melalui CLI (Command Line Interface).

Hah?

Memangnya buat apa menjalankan Controller dari CLI/CMD?

Kadang ini kita butuhkan untuk mengeksekusi CORN jobs di server. Soalnya di server kan gak ada web browser. Semua berbasis teks hehe.

Cara mengeksekusi Controller dari CLI adalah dengan mengeksekusi file index.php lalu diberikan argumen dengan nama controller dan method.

Contoh:

Kita punya controller seperti ini:

<?php
class Notification extends CI_Controller
{
  public function send_remainder($message){
    print("Remainder: $message");
  }
}

Maka perintah untuk menjalankannya adalah:

php index.php notification send_remainder 'Hello'

Latihan: Membuat Controller Artikel

Silakan buka project beritacoding!

Kita akan membuat Controller Article untuk menampilkan list artikel dan detail artikel.

Buatlah file baru di dalam application/controllers/ dengan nama Article.php.

Kemudian isi dengan kode berikut:

<?php

class Article extends CI_Controller 
{
	public function index()
	{
		// @TODO: get article from model
		$data['articles'] = [
			[
				'title' => 'Foo',
				'content' => 'Ini artikel tentang foo',
			],
			[
				'title' => 'Bar',
				'content' => 'Ini artikel tentang Bar',
			],
		];

		if(count($data['articles']) > 0){
			$this->load->view('articles/list_article.php', $data);
		} else {
			$this->load->view('articles/empty_article.php');
		}
	}

	public function show($slug = null)
	{
		// @TODO: get article from model
		$this->load->view('articles/show_article.php');
	}
}

Pada kode di atas, kita membuat variabel $data dengan isi array untuk dummy data yang akan ditampilkan ke view list_article.php.

View yang kita load belum dibuat.

Mari kita buat..

Buatlah folder baru di dalam views dengan nama articles dengan kode masing-masing sebagai berikut:

📜 views/articles/list_article.php

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>List of Article</title>
</head>
<body>

<h1>List Artikel</h1>
<ul>
	<?php foreach($articles as $article): ?>
	<li><?= $article['title'] ?></li>
	<?php endforeach ?>
</ul>

</body>
</html>

📜 views/articles/empty_article.php

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>List of Article</title>
</head>
<body>

<h1>Tidak ada artikel</h1>

</body>
</html>

📜 views/articles/show_article.php

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Read Article</title>
</head>
<body>

<h1>Halaman untuk baca artikel</h1>

</body>
</html>

Sekarang mari kita coba.

Buka URL berikut:

localhost/beritacoding/index.php/article/

Hasilnya:

controller list article

Coba juga untuk membuka

localhost/beritacoding/index.php/article/show

Hasilnya:

controller article show

Latihan: Memproses Form di Controller

Setelah kita belajar banyak tentang input dan output di Controller, saatnya kita mencoba sendiri.

Oke, sekarang coba buka kembali Controller Page.

<?php

class Page extends CI_Controller
{
	public function index()
	{
		$this->load->view('home');
	}

	public function about()
	{
		$this->load->view('about');
	}

	public function contact()
	{
		$this->load->view('contact');
	}
}

Pada Controller ini, kita akan coba mengambil input dari method contact().

Mari kita buat form-nya dulu!

Bukalah file view/contact.php kemudian isi kodenya menjadi seperti ini:

<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Hubungi kami</title>
</head>

<body>

	<h1>Contact Us</h1>
	<p>Hubungi kami melalui form berikut</p>
	<form action="" method="post">
		<div>
			<label for="name">Name</label>
			<input type="text" name="name" placeholder="your name" required/>
		</div>
		<div>
			<label for="email">Email</label>
			<input type="email" name="email" placeholder="your email address" required/>
		</div>
		<div>
			<label for="message">Message</label><br>
			<textarea name="message" cols="30" rows="5" placeholder="write your message" required></textarea>
		</div>

		<div>
			<input type="submit" value="Kirim">
			<input type="reset" value="Reset">
		</div>
	</form>

</body>

</html>

Perhatikan!

Pada form ini kita menggunakan atribut action="" yang artinya kita akan mengirim post ke method yang me-load view tersebut, dalam kasus ini contact().

Apabila ingin mengirim data ke controller yang lain, kita bisa tentukan alamat controllernya pada atribut action="".

Contohnya:

<form action="/article/new" method="post">

Kita juga bisa memanfaatkan URL helper, yang akan kita pelajari nanti di bagian View.

Oke lanjut..

Sekarang ubahlah method contact() pada Controller Page menjadi seperti ini:

public function contact()
{
	if ($this->input->method() === 'post') {
		print_r($this->input->post());
	}

	$this->load->view('contact');
}

Pada method ini, kita melakukan pengecekan..

Apakah method-nya diakses dengan metode POST atau GET. Jika menggunakan POST berarti ada pengiriman data, dan kita coba tampilkan datanya dengan print_r().

Sedangkan jika dibuka dengan metode GET, maka tampilkan saja form dari view contact.

Mari kita coba hasilnya:

halaman contact

Sekarang coba isi form-nya dan kirim!

Maka hasilnya:

hasil input form contact

Yap, hasilnya ditampilkan karena kita menggunakan fungsi print_r().

Berdasarkan hasil tersebut, ternyata $this->input->post() isinya berupa array asosiatif.

Buat kamu yang belum tau apa itu array asosiatif, silakan baca:

Selanjutnya kita bisa proses data yang didapatkan dari $this->input->post() seperti menyimpannya ke database atau mengirim ke email admin.

Apa Selanjutnya?

Selamat, kamu sudah belajar tentang Controller di Codeigniter.

Saya tahu, ini masih belum cukup.

Karena itu, silakan baca juga dokumentasi Codeginiter.

Berikutnya silakan pelajari tentang:

Source code tutorial dapat di-download di Github.

[🎁 Download Source Code]