Tutorial Codeigniter #04: Memahami Controller Lebih Dalam
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
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
:
$this->input->post()
untuk mengambil input dari form yang menggunakan metode POST untuk pengiriman data;$this->input->get()
untuk mengambil input dari query string atau form yang menggunakan metode GET untuk pengiriman data;$this->input->cookie()
untuk mengambil input dari cookie browser;$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:
Coba juga untuk membuka
localhost/beritacoding/index.php/article/show
Hasilnya:
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:
Sekarang coba isi form-nya dan kirim!
Maka hasilnya:
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.