CodeIgniter - Framework PHP Ringan dan Mudah
Dipublikasikan pada 15 Januari 2024 โข โฑ๏ธ 45 menit baca
Apa itu CodeIgniter?
CodeIgniter adalah framework PHP yang ringan dengan footprint kecil, dibuat untuk developer yang ingin toolkit sederhana dan elegan untuk membuat aplikasi web full-featured.
Keunggulan CodeIgniter
๐ Ringan dan Cepat
Framework yang sangat ringan dengan performa tinggi.
๐ Mudah Dipelajari
Sintaks yang sederhana dan dokumentasi yang jelas.
๐ฏ MVC Pattern
Menggunakan pola Model-View-Controller yang terstruktur.
๐ง Konfigurasi Minimal
Sedikit konfigurasi yang diperlukan untuk memulai.
๐ฆ Libraries Lengkap
Built-in libraries untuk task umum seperti database, email, session.
๐ Security
Fitur keamanan built-in seperti XSS filtering, CSRF protection.
CodeIgniter vs Framework Lain
Aspek | CodeIgniter | Laravel | Symfony |
---|---|---|---|
Learning Curve | Mudah | Sedang | Sulit |
Performa | Sangat Cepat | Cepat | Cepat |
Footprint | Ringan | Berat | Berat |
Fitur | Cukup | Lengkap | Sangat Lengkap |
Instalasi CodeIgniter
Prasyarat Sistem
- PHP >= 7.4
- Web server (Apache/Nginx)
- Database (MySQL/PostgreSQL/SQLite) - opsional
1. Download Manual
# Download dari official website
# https://codeigniter.com/download
# Extract ke web server directory
unzip CodeIgniter-4.x.x.zip
mv CodeIgniter-4.x.x/ my-codeigniter-app/
2. Instalasi via Composer
# Buat project CodeIgniter baru
composer create-project codeigniter4/appstarter my-codeigniter-app
# Masuk ke direktori project
cd my-codeigniter-app
# Jalankan development server
php spark serve
3. Konfigurasi Environment
Copy file env
menjadi .env
:
cp env .env
Edit file .env
untuk konfigurasi:
# Ubah environment ke development
CI_ENVIRONMENT = development
# Base URL aplikasi
app.baseURL = 'http://localhost:8080'
# Database configuration
database.default.hostname = localhost
database.default.database = ci4_db
database.default.username = root
database.default.password =
database.default.DBDriver = MySQLi
4. Menjalankan Aplikasi
# Menggunakan built-in server
php spark serve
# Atau dengan port custom
php spark serve --port=8000
# Akses di browser: http://localhost:8080
Struktur Direktori CodeIgniter 4
codeigniter-project/
โโโ app/ # Application folder
โ โโโ Config/ # Configuration files
โ โโโ Controllers/ # Controllers
โ โโโ Database/ # Migrations, Seeds
โ โโโ Filters/ # Request filters
โ โโโ Helpers/ # Custom helpers
โ โโโ Libraries/ # Custom libraries
โ โโโ Models/ # Models
โ โโโ Views/ # View templates
โ โโโ Common.php # Common functions
โโโ public/ # Public folder (web root)
โ โโโ index.php # Front controller
โ โโโ css/ # CSS files
โ โโโ js/ # JavaScript files
โ โโโ images/ # Image files
โโโ system/ # Framework core files
โโโ tests/ # Unit tests
โโโ vendor/ # Composer dependencies
โโโ writable/ # Writable files (cache, logs, session)
โ โโโ cache/ # Cache files
โ โโโ logs/ # Log files
โ โโโ session/ # Session files
โโโ .env # Environment configuration
โโโ composer.json # Composer configuration
โโโ spark # Command line tool
Direktori Penting
- app/ - Berisi seluruh kode aplikasi Anda
- public/ - Document root web server, berisi index.php
- system/ - Core framework (jangan dimodifikasi)
- writable/ - Direktori yang dapat ditulis oleh aplikasi
Autoloading
CodeIgniter 4 menggunakan autoloading PSR-4:
{
"autoload": {
"psr-4": {
"App\\": "app/"
}
}
}
Model-View-Controller (MVC)
CodeIgniter menggunakan pola MVC untuk memisahkan logic aplikasi:
1. Controller
File: app/Controllers/Home.php
<?php
namespace App\Controllers;
class Home extends BaseController
{
public function index()
{
$data = [
'title' => 'Welcome to CodeIgniter',
'message' => 'Hello World!'
];
return view('welcome_message', $data);
}
public function about()
{
$data = [
'title' => 'About Us',
'content' => 'This is about page'
];
return view('about', $data);
}
public function contact($name = null)
{
if ($name) {
$data['message'] = "Hello, " . esc($name);
} else {
$data['message'] = "Hello, Guest";
}
return view('contact', $data);
}
}
?>
2. Model
File: app/Models/UserModel.php
<?php
namespace App\Models;
use CodeIgniter\Model;
class UserModel extends Model
{
protected $table = 'users';
protected $primaryKey = 'id';
protected $allowedFields = [
'name', 'email', 'password'
];
protected $validationRules = [
'name' => 'required|min_length[3]',
'email' => 'required|valid_email|is_unique[users.email]',
'password' => 'required|min_length[6]'
];
protected $validationMessages = [
'email' => [
'is_unique' => 'Email already exists.'
]
];
// Custom method
public function getUserByEmail($email)
{
return $this->where('email', $email)->first();
}
public function getActiveUsers()
{
return $this->where('status', 'active')->findAll();
}
}
?>
3. View
File: app/Views/welcome_message.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><?= esc($title) ?></title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container mt-5">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">
<h1><?= esc($title) ?></h1>
</div>
<div class="card-body">
<p class="lead"><?= esc($message) ?></p>
<?php if (isset($users)): ?>
<h3>Users List</h3>
<ul class="list-group">
<?php foreach ($users as $user): ?>
<li class="list-group-item">
<strong><?= esc($user['name']) ?></strong> -
<?= esc($user['email']) ?>
</li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
4. Routing
File: app/Config/Routes.php
<?php
use CodeIgniter\Router\RouteCollection;
/**
* @var RouteCollection $routes
*/
// Default route
$routes->get('/', 'Home::index');
// Basic routes
$routes->get('/about', 'Home::about');
$routes->get('/contact', 'Home::contact');
$routes->get('/contact/(:any)', 'Home::contact/$1');
// Resource routes
$routes->resource('users');
// Group routes
$routes->group('admin', function($routes) {
$routes->get('/', 'Admin::index');
$routes->get('users', 'Admin::users');
$routes->get('posts', 'Admin::posts');
});
// Route dengan filter
$routes->get('profile', 'User::profile', ['filter' => 'auth']);
?>
Database di CodeIgniter
1. Konfigurasi Database
File: app/Config/Database.php
<?php
namespace Config;
use CodeIgniter\Database\Config;
class Database extends Config
{
public array $default = [
'DSN' => '',
'hostname' => 'localhost',
'username' => 'root',
'password' => '',
'database' => 'ci4_db',
'DBDriver' => 'MySQLi',
'DBPrefix' => '',
'pConnect' => false,
'DBDebug' => true,
'charset' => 'utf8',
'DBCollat' => 'utf8_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
'failover' => [],
'port' => 3306,
];
}
?>
2. Query Builder
<?php
$db = \Config\Database::connect();
// SELECT
$query = $db->table('users')
->select('id, name, email')
->where('status', 'active')
->orderBy('name', 'ASC')
->limit(10)
->get();
$users = $query->getResultArray();
// INSERT
$data = [
'name' => 'John Doe',
'email' => 'john@example.com',
'password' => password_hash('secret', PASSWORD_DEFAULT)
];
$db->table('users')->insert($data);
// UPDATE
$db->table('users')
->where('id', 1)
->update(['name' => 'John Smith']);
// DELETE
$db->table('users')
->where('id', 1)
->delete();
// JOIN
$query = $db->table('users u')
->join('profiles p', 'p.user_id = u.id')
->where('u.status', 'active')
->get();
?>
3. Migrations
# Buat migration
php spark make:migration CreateUsersTable
# Jalankan migration
php spark migrate
# Rollback migration
php spark migrate:rollback
File: app/Database/Migrations/2023-01-01-000001_CreateUsersTable.php
<?php
namespace App\Database\Migrations;
use CodeIgniter\Database\Migration;
class CreateUsersTable extends Migration
{
public function up()
{
$this->forge->addField([
'id' => [
'type' => 'INT',
'constraint' => 5,
'unsigned' => true,
'auto_increment' => true,
],
'name' => [
'type' => 'VARCHAR',
'constraint' => '100',
],
'email' => [
'type' => 'VARCHAR',
'constraint' => '100',
'unique' => true,
],
'password' => [
'type' => 'VARCHAR',
'constraint' => '255',
],
'created_at' => [
'type' => 'DATETIME',
'null' => true,
],
'updated_at' => [
'type' => 'DATETIME',
'null' => true,
],
]);
$this->forge->addPrimaryKey('id');
$this->forge->createTable('users');
}
public function down()
{
$this->forge->dropTable('users');
}
}
?>
Helpers dan Libraries
1. Built-in Helpers
<?php
// Load helpers
helper(['url', 'form', 'array']);
// URL Helper
echo base_url('assets/css/style.css');
echo site_url('users/profile');
echo current_url();
echo previous_url();
// Form Helper
echo form_open('users/create');
echo form_input('name', 'John Doe');
echo form_submit('submit', 'Save');
echo form_close();
// Array Helper
$array = ['a' => 1, 'b' => 2, 'c' => 3];
$value = dot_array_search('a', $array); // 1
// Text Helper
echo word_limiter('This is a long text', 3); // This is a...
echo character_limiter('Long text here', 10); // Long text...
// Date Helper
echo now(); // Current timestamp
echo date('Y-m-d H:i:s', now());
?>
2. Custom Helper
File: app/Helpers/my_helper.php
<?php
if (!function_exists('format_currency')) {
function format_currency($amount)
{
return 'Rp ' . number_format($amount, 0, ',', '.');
}
}
if (!function_exists('time_ago')) {
function time_ago($datetime)
{
$time = time() - strtotime($datetime);
if ($time < 60) return 'just now';
if ($time < 3600) return floor($time/60) . ' minutes ago';
if ($time < 86400) return floor($time/3600) . ' hours ago';
return floor($time/86400) . ' days ago';
}
}
if (!function_exists('generate_slug')) {
function generate_slug($text)
{
$text = preg_replace('/[^A-Za-z0-9-]+/', '-', $text);
return strtolower(trim($text, '-'));
}
}
?>
3. Libraries
<?php
// Validation
$validation = \Config\Services::validation();
$validation->setRules([
'name' => 'required|min_length[3]',
'email' => 'required|valid_email',
'password' => 'required|min_length[6]'
]);
if ($validation->run($data)) {
// Valid
} else {
// Show errors
$errors = $validation->getErrors();
}
// Session
$session = \Config\Services::session();
$session->set('user_id', 123);
$userId = $session->get('user_id');
$session->setFlashdata('message', 'Data saved successfully!');
// Email
$email = \Config\Services::email();
$email->setTo('user@example.com');
$email->setFrom('admin@yoursite.com', 'Your Name');
$email->setSubject('Email Test');
$email->setMessage('Testing the email class.');
if ($email->send()) {
echo 'Email sent successfully!';
} else {
echo $email->printDebugger();
}
// Upload
$upload = \Config\Services::upload();
if ($upload->isValid('userfile') && !$upload->hasMoved()) {
$newName = $upload->getRandomName();
$upload->move(WRITEPATH . 'uploads', $newName);
}
?>
4. Filters
File: app/Filters/AuthFilter.php
<?php
namespace App\Filters;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\Filters\FilterInterface;
class AuthFilter implements FilterInterface
{
public function before(RequestInterface $request, $arguments = null)
{
$session = session();
if (!$session->get('user_id')) {
return redirect()->to('/login');
}
}
public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
{
// Do something here
}
}
?>
Tips dan Best Practices
โ Do (Lakukan)
- Gunakan model untuk semua operasi database
- Validasi semua input user
- Gunakan esc() untuk output ke view
- Manfaatkan built-in helpers
- Ikuti naming convention CodeIgniter
- Gunakan environment untuk konfigurasi
โ Don't (Jangan)
- Jangan modifikasi file di folder system/
- Jangan langsung echo data user tanpa escape
- Jangan hardcode konfigurasi di controller
- Jangan gunakan query raw tanpa alasan kuat
- Jangan commit file .env ke repository
- Jangan abaikan error handling