Membedah arsitektur inti Yii: pola MVC yang ditegakkan lewat struktur folder, application components yang diakses lewat Yii::$app, dependency injection container, event system, konfigurasi berbasis array, dan arsitektur ekstensi berbasis Composer yang membuat Yii tetap ringan karena lazy loading di mana-mana.

Setelah di episode 1 kita memahami dari mana Yii berasal dan mengapa ia relevan di 2026, pada episode ini kita masuk ke dalam mesinnya: bagaimana Yii mengorganisasikan dirinya. Ini bukan sekadar teori — memahami arsitektur akan menentukan cara kalian menaruh kode, membaca error, dan memutuskan di mana sebuah logika seharusnya hidup.
Yii menegakkan pola MVC dengan disiplin tinggi lewat struktur folder. Ia juga memperkenalkan konsep application components — layanan yang selalu tersedia lewat satu titik akses global Yii::$app — serta memakai dependency injection container dan event system untuk menjaga kode tetap longgar-terhubung (loosely coupled). Di episode ini kita bedah kelima konsep ini satu per satu.
Yii memetakan MVC langsung ke struktur folder — tidak ada kebebasan menaruh controller di sembarang tempat:
app/
├── controllers/ # PostController, SiteController, ...
├── models/ # Post, Comment, User, ...
├── views/ # post/index.php, post/view.php, ...
│ └── layouts/ # main.php, print.php
├── config/ # web.php, console.php, params.php
└── web/ # index.php (entry point)Alurnya sederhana namun tegas:
models/) adalah tempat data dan logika bisnis: class yang mewarisi yii\db\ActiveRecord merepresentasikan satu tabel, lengkap dengan aturan validasi dan relasi.views/) adalah file PHP tampilan — murni presentasi, tanpa logika bisnis. View bisa memakai layout sebagai kerangka halaman (header, footer, navbar) yang dipakai bersama semua halaman.controllers/) adalah penghubung: ia membaca request, memanggil model, lalu me-render view. Setiap method public di controller yang berakhiran action menjadi action yang bisa dipanggil via URL.Yii::$appYii mengemas layanan-layanan inti sebagai application components: object yang terdaftar di konfigurasi aplikasi dan diakses lewat Yii::$app. Analoginya seperti meja resepsionis hotel: kalian tidak perlu tahu di mana dapur, laundry, atau ruang server berada — cukup tanyakan ke Yii::$app dan layanan yang diminta tersedia:
$db = Yii::$app->db; // koneksi database
$cache = Yii::$app->cache; // cache component
$user = Yii::$app->user; // data user yang login
$session = Yii::$app->session; // session
$request = Yii::$app->request; // data HTTP request
$response = Yii::$app->response; // objek HTTP responseKekuatan desain ini: komponen di-load lazy — Yii::$app->cache baru diinisialisasi saat benar-benar diakses. Inilah salah satu sumber performa Yii: aplikasi yang tidak memakai session tidak akan pernah memuat session ke memori.
Tip
Komponen bisa kalian daftarkan sendiri. Cukup tambahkan di bagian components pada config/web.php, lalu akses lewat Yii::$app->namaKomponen. Inilah cara standar menambahkan layanan global seperti Yii::$app->queue, Yii::$app->redis, atau Yii::$app->i18n — komponen yang akan kita pakai di episode-episode berikutnya.
Yii 2.0 memperkenalkan dependency injection (DI) container — object yang bertugas membuat dan mengatur class beserta dependensinya. Ketimbang tiap class membuat dependensinya sendiri dengan new, class cukup meminta dependensinya lewat constructor, dan container yang menyediakannya:
<?php
namespace app\components;
use yii\base\Component;
use yii\redis\Connection;
class ReportService extends Component
{
public function __construct(
private readonly Connection $redis,
private readonly array $config = [],
) {
}
}Yii bisa meng-resolve dependensi ini secara otomatis — ini yang membuat kode Yii mudah ditest (kita bisa menyuntik dependency palsu) dan mudah dipelihara (mengganti implementasi tidak perlu menyentuh pemanggil). DI container di Yii juga memakai konfigurasi berbasis array, konsisten dengan filosofi konfigurasi Yii.
Yii memiliki event system yang memungkinkan kode bereaksi terhadap kejadian tertentu tanpa saling bergantung langsung. Component bisa memicu event, dan bagian lain dari aplikasi bisa mendaftarkan handler:
use yii\db\ActiveRecord;
$post = new Post();
// mendaftarkan handler saat record disimpan
$post->on(ActiveRecord::EVENT_BEFORE_SAVE, function ($event) {
$model = $event->sender;
$model->updated_at = date('Y-m-d H:i:s');
});
// memicu event
$post->save();Event system inilah yang dipakai Yii untuk membangun fitur seperti behaviors (timestamp otomatis, soft delete) — kita bedah penuh di episode 14. Event juga menjadi dasar ekstensi: package pihak ketiga bisa "menempel" ke siklus hidup model tanpa mengubah kode inti.
Ciri khas Yii: hampir semua perilaku dikendalikan lewat array konfigurasi — bukan file YAML atau DSL khusus. File config/web.php adalah contohnya:
<?php
$params = require __DIR__ . '/params.php';
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'components' => [
'cache' => [
'class' => 'yii\caching\FileCache',
],
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=blog',
'username' => 'root',
'password' => '',
],
],
];
return $config;Array ini adalah "cetak biru": Yii membaca class, lalu mengisi properti-properti object sesuai kunci array. Yii::$app->db di atas adalah instance yii\db\Connection yang dsn-nya sudah terisi. Karena murni PHP, konfigurasi bisa bercabang, memakai variabel, dan mudah di-merge — kita lihat praktik merge ini saat membahas environments di episode 20.
Terakhir, Yii dibangun di atas ekosistem ekstensi berbasis Composer. Framework inti hanyalah yiisoft/yii2 — semua kemampuan tambahan (queue, redis, auth client, debug, gii) adalah package Composer terpisah:
composer require yiisoft/yii2-queue
composer require yiisoft/yii2-redis
composer require yiisoft/yii2-authclient
composer require yiisoft/yii2-debug --dev
composer require yiisoft/yii2-gii --devFilosofi ini membuat aplikasi Yii tetap ringan: kalian hanya memuat yang kalian pakai. Pada Yii3, filosofi ini diekstremkan menjadi package-based total — setiap bagian framework adalah package terpisah dengan versi sendiri (episode 23).
Inti yang harus dibawa pulang:
Yii::$app dan di-load lazy — sumber performa.Di episode 3 selanjutnya, kita akan menginstall Yii dan membuat project template pertama — composer create-project yiisoft/yii2-app-basic untuk Yii2 dan yiisoft/app untuk Yii3, membedah struktur folder yang dihasilkan, lalu menjalankan hello world pertama dengan konfigurasi aplikasi yang nyata. Pastikan environment episode 0 sudah siap, karena mulai sekarang kita menulis kode!