Struktur Direktori Ci4 Docker

Sekarang saya pakai docker dalam pengembangan web dengan framework Ci4. Sebelumnya saya sering pakai environment lengkap seperti xampp ataupun Laragon. Tetapi karena saya memiliki beberapa project legacy yang masih pakai dependency lama, seperti php 7 atau yang lain, sehingga kadang kesulitan menyesuaikan atau mengganti dependency jika pakai Xampp atau Laragon. Apalagi kalau ada project paralel yang harus pakai dua versi php yang berbeda.

Dengan pengembangan berbasis kontainer seperti Docker, kita bisa mengatur lingkungan yang berbeda setiap project. Lingkungan pengembangan satu project bisa kita buat independen terhadap project lain. Kita juga bisa jalankan dua project itu secara bersamaan tanpa mengganggu project yang lain.

Untuk kasus Ci4 dan bisa juga untuk framework lain sejenis, kita bisa pisahkan direktori untuk public dan private. Tujuannya diantaranya untuk keamanan dan konsistensi git workflow.

Misalhnya kita bisa buat struktur direktori seperti berikut:

project_directory
|- docker-compose.yml
|- Dockerfile
|- src
|-- private
|-- public

Kita bisa masukkan semua code ci4 di direktori private. Kemudian copy isi dari direktori public dalam ci4 ke src/public. Kemudian kita mapping src/public ke document root dalam kontainer. Kita map juga direktori private ke server.

Berikut docker compose nya:

name: 'ci4zuriah'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: zuriah_app
    ports:
      - "8080:80"
    volumes:
      - ./src/public:/var/www/html
      - ./src/private:/var/www/private
      - ./docker/php.ini:/usr/local/etc/php/php.ini
    depends_on:
      - db
    networks:
      - ci4net

  db:
    image: arm64v8/mysql:9.4.0-oracle
    container_name: zuriah_db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: ci4db
      MYSQL_USER: ci4user
      MYSQL_PASSWORD: ci4pass
    ports:
      - "3356:3306"
    volumes:
      - dbdata:/var/lib/mysql
    networks:
      - ci4net

  phpmyadmin:
    image: arm64v8/phpmyadmin:5.2
    container_name: zuriah_myadmin
    restart: always
    ports:
      - "8051:80"
    environment:
      PMA_HOST: db
      MYSQL_ROOT_PASSWORD: rootpass
      UPLOAD_LIMIT: 10M
    depends_on:
      - db
    networks:
      - ci4net

volumes:
  dbdata:

networks:
  ci4net:

Dockerfile

FROM php:8.3-apache

# Install dependencies
RUN apt-get update && apt-get install -y \
    libicu-dev \
    libpq-dev \
    libpng-dev \
    libjpeg-dev \
    libfreetype6-dev \
    unzip \
    curl \
    zip 

# Install Composer
RUN curl -sS https://getcomposer.org/installer | php -- \
    && mv composer.phar /usr/local/bin/composer

# Aktifkan ekstensi PHP
RUN docker-php-ext-configure gd \
    --with-freetype \
    --with-jpeg \
    && docker-php-ext-install \
    gd \
    intl \
    mysqli \
    pdo \
    pdo_mysql

# Aktifkan mod_rewrite Apache
RUN a2enmod rewrite

# Restart Apache agar perubahan berlaku
RUN service apache2 restart

Kediri, 20 oct 2025

Dockerfile untuk Ci4 dengan Composer

Dengan case ingin menjalankan composer didalam container php dengan apache

FROM php:8.1-apache

# Install dependencies
RUN apt-get update && apt-get install -y \
    libicu-dev \
    libpq-dev \
    unzip \
    curl \
    zip \

# Install Composer
RUN curl -sS https://getcomposer.org/installer | php -- \
    && mv composer.phar /usr/local/bin/composer

# Aktifkan ekstensi PHP Intl 
RUN docker-php-ext-install intl mysqli pdo pdo_mysql

# Aktifkan mod_rewrite Apache
RUN a2enmod rewrite

# Restart Apache agar perubahan berlaku
RUN service apache2 restart

p9, 2 Oct 2025

Membuat HMVC di CodeIgniter 4

CodeIgniter 4 hadir dengan struktur yang lebih modern dan fleksibel dibanding versi sebelumnya. Salah satu pendekatan arsitektur yang sering digunakan untuk membangun aplikasi besar dengan pemisahan modul yang baik adalah HMVC (Hierarchical Model-View-Controller).

HMVC memungkinkan pengembang membagi aplikasi menjadi modul independen, sehingga setiap bagian memiliki Controller, Model, dan View sendiri. Dengan pendekatan ini, kode menjadi lebih modular, reusable, dan scalable.

Pada artikel ini, kita akan membahas cara mengimplementasikan HMVC di CodeIgniter 4, mulai dari struktur folder, konfigurasi autoloading PSR-4, hingga contoh penggunaan.

Pengertian HMVC

HMVC adalah arsitektur berbasis MVC, tetapi setiap bagian proyek terbagi ke dalam modul independen. Ini membantu dalam pemisahan fitur, sehingga pengembangan menjadi lebih mudah dan terorganisir.

Keuntungan Menggunakan HMVC

Modularitas – Setiap fitur aplikasi bisa dikelola secara terpisah dalam modul.
Reusability – Modul dapat digunakan kembali tanpa harus menulis ulang kode.
Kemudahan Pengelolaan – Mempermudah pengembangan proyek besar dengan tim.
Scalability – Memungkinkan ekspansi sistem tanpa harus merombak seluruh arsitektur.

Struktur Folder HMVC

Di CodeIgniter 4, kita dapat membuat struktur modul HMVC dalam folder app/Modules/. Berikut contoh struktur proyek dengan HMVC:

app/
├── Modules/
│   ├── Admin/
│   │   ├── Config/
│   │   │   ├── Routes.php
│   │   ├── Controllers/
│   │   │   ├── AdminController.php
│   │   ├── Models/
│   │   │   ├── AdminModel.php
│   │   ├── Views/
│   │   │   ├── admin.php
│   ├── Blog/
│   │   ├── Config/
│   │   │   ├── Routes.php
│   │   ├── Controllers/
│   │   │   ├── PostController.php
│   │   ├── Models/
│   │   │   ├── PostModel.php
│   │   ├── Views/
│   │   │   ├── post_list.php

Setiap modul memiliki Controller, Model, dan View sendiri, sehingga kode lebih terstruktur dan mudah dikelola.

Konfigurasi PSR-4 untuk Modul HMVC

Agar CodeIgniter mengenali modul tanpa perlu menuliskan path lengkap, kita harus mengatur PSR-4 autoloading.

Buka file app/Config/Autoload.php dan tambahkan modul ke dalam $psr4 :

public $psr4 = [
    'App'  => APPPATH,
    'Modules' => APPPATH . 'Modules'
];

Membuat Routes

Buat file Routes.php di dalam app/Modules/Blog/Config/Routes.php :

<?php 

namespace Modules\Blog\Config;

use CodeIgniter\Router\RouteCollection;

class Routes {
    public static function defineRoutes(RouteCollection $routes) {
        $routes->group('/blog', ['namespace' => 'Modules\Blog\Controllers'], function($routes) {
            $routes->get('/', 'PostController::index');
        });
    }
}

Mengatur Routes

Buka Routes pada app/Config/Routes.php dan tambahkan dua baris paling bawah sehingga isi routes menjadi seperti berikut:

<?php

use CodeIgniter\Router\RouteCollection;

/**
 * @var RouteCollection $routes
 */
$routes->get('/', 'Home::index');
$routes->get('user', 'Home::index');


use Modules\Blog\Config\Routes as CarRoutes;
CarRoutes::defineRoutes($routes);

Membuat Controller

Sekarang kita buat Controller di app/Modules/Blog/Controllers/PostController.php

namespace Modules\Blog\Controllers;

use CodeIgniter\Controller;
use Modules\Blog\Models\PostModel;

class PostController extends Controller
{
    public function index()
    {
        $model = new PostModel();
        $data['posts'] = $model->getPosts();

        return view('Modules\Blog\Views\post_list', $data);
    }
}

Model dan Views

Membuat model dan view sama seperti dalam MVC biasa, tinggal disesuaikan namespace dan panggil nya.

Membuat Docker Compose untuk CodeIgniter 4 dengan Apache, PostgreSQL, dan pgAdmin

Docker telah menjadi solusi populer dalam pengembangan aplikasi karena kemampuannya dalam mengelola lingkungan secara konsisten. Dalam artikel ini, kita akan membahas cara membuat Docker Compose untuk menjalankan CodeIgniter 4 dengan Apache, PostgreSQL, dan pgAdmin. Konfigurasi ini juga akan mengaktifkan ekstensi PHP intl, pgsql, dan mod_rewrite menggunakan Dockerfile untuk pengaturan yang lebih fleksibel

Struktur Folder

pastikan struktur proye seperti berikut

/project-root
├── docker-compose.yml
├── Dockerfile

Setiap layanan memiliki folder dan Dockerfile sendiri agar dapat dikustomisasi secara modular.

Konfigurasi Dockerfile untuk Codeigniter 4

Buat file app/Dockerfile untuk PHP dengan Apache, mengaktifkan ekstensi yang dibutuhkan seperti pgsql, intl, dan mengaktifkan mod_rewrite:

# Menggunakan image dasar PHP dengan Apache
FROM php:8.2-apache

# Perbarui package manager dan install ekstensi yang diperlukan
RUN apt-get update && apt-get install -y \
    libicu-dev \
    libpq-dev \
    unzip

# Aktifkan ekstensi PHP Intl dan PostgreSQL
RUN docker-php-ext-install intl pgsql

# Aktifkan mod_rewrite Apache
RUN a2enmod rewrite

# Restart Apache agar perubahan berlaku
RUN service apache2 restart

EXPOSE 80
CMD ["apache2-foreground"]

Konfigurasi Docker Compose

Buat file docker-compose.yml untuk menghubungkan semua layanan:

version: '3.8'

services:
  app:
    build: .
    container_name: codeigniter4_app
    restart: always
    volumes:
      - ./html:/var/www/html
    ports:
      - "8080:80"
    depends_on:
      - db
    environment:
      - CI_ENV=development
    networks:
      - ci_network

  db:
    image: postgres:15
    container_name: ci4_postgres
    restart: always
    environment:
      POSTGRES_USER: ci4_user
      POSTGRES_PASSWORD: ci4_password
      POSTGRES_DB: ci4_database
    volumes:
      - ./postgresql/data:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    networks:
      - ci_network

  pgadmin:
    image: dpage/pgadmin4
    container_name: pgadmin_ci4
    restart: always
    environment:
      PGADMIN_DEFAULT_EMAIL: [email protected]
      PGADMIN_DEFAULT_PASSWORD: adminpassword
    ports:
      - "5050:80"
    depends_on:
      - db
    networks:
      - ci_network

networks:
  ci_network:
    driver: bridge

Menjalankan Docker Compose

Setelah semua konfigurasi selesai, jalankan perintah berikut untuk membangun semua layanan:

docker-compose up --build -d