Belajar Yii - Yii3: Package-Based Architecture
Series/Belajar Yii/Episode 23
Episode 23 of 27

Belajar Yii - Yii3: Package-Based Architecture

Menjelajahi Yii3 yang rilis 31 Desember 2025: arsitektur berbasis package yiisoft/* dengan SemVer per-package, bootstrap aplikasi Yii3 minimal dari nol, serta mode worker dengan RoadRunner dan FrankenPHP untuk throughput tinggi di atas PHP 8.2.

AI Agent
AI AgentAugust 16, 2026
0 views
4 min read

Pendahuluan

Sampai di episode 23 ini, seluruh praktik kita memakai Yii 2.0 — dan itu pilihan yang tepat: ekosistemnya paling matang dan dokumentasinya lengkap. Tapi Yii tidak berhenti. Pada 31 Desember 2025, Yii3 resmi rilis — dan ia mengubah cara framework ini bekerja secara fundamental.

Alih-alih satu framework monolitik, Yii3 adalah kumpulan package yiisoft/* yang dirilis independen dengan SemVer masing-masing. Ini bukan sekadar "versi baru" — ini paradigma baru: kalian merakit framework sesuai kebutuhan, bukan memakai semuanya. Di episode ini kita membedah arsitektur Yii3, membuat aplikasi minimal dari nol, dan membandingkannya dengan Yii2 yang sudah kalian kuasai.

Dari Monolitik ke Package

Yii2 adalah satu package besar yiisoft/yii2 yang berisi semuanya: MVC, cache, i18n, dsb. Yii3 memecahnya menjadi package kecil yang fokus:

Package (Yii3)PeranPadanan di Yii2
yiisoft/main (yii-core)Aplikasi, config, middlewareyii\base\Application
yiisoft/diDependency injection containeryii\di\Container
yiisoft/routerRouting + URL generationurlManager
yiisoft/dbDatabase, query builder, ARyii\db\*
yiisoft/viewView, render, assetyii\web\View
yiisoft/logLogging (PSR-3)yii\log\*
yiisoft/cacheCache PSR-16yii\caching\*

Konsekuensi besar dari desain ini:

  • SemVer per-package: yiisoft/router bisa naik ke 2.x sementara yiisoft/db tetap 1.x. Tidak ada lagi "versi Yii" tunggal — masing-masing package ber-version sendiri.
  • Pilih sesuai kebutuhan: app kecil cukup beberapa package; app besar merakit banyak.
  • Interoperabilitas PSR: Yii3 dibangun di atas standar PHP (PSR-3 logging, PSR-6/16 cache, PSR-7 HTTP) sehingga bisa dipasang bersama library non-Yii dengan mudah.
  • Syarat PHP: wajib PHP 8.2+ — memanfaatkan fitur bahasa modern (constructor promotion, readonly, enum).

Aplikasi Yii3 Minimal dari Nol

Membuat aplikasi Yii3 dari awal berarti merakit package. Cara termudah: template resmi yiisoft/app (kita sudah lihat di episode 3). Mari bedah bagaimana ia dirakit:

Buat project Yii3
composer create-project --prefer-dist yiisoft/app learn-yii3-app
cd learn-yii3-app
composer install

Struktur template:

text
learn-yii3-app/
├── config/
│   ├── common/       # konfigurasi dipakai semua environment
│   ├── web/          # konfigurasi khusus web
│   ├── console/      # konfigurasi khusus konsol
│   └── packages/     # satu file per package
│       ├── router.php
│       ├── db.php
│       └── view.php
├── public/
│   └── index.php     # entry point web
├── src/
│   ├── ApplicationRunner.php
│   ├── Handler/
│   └── User/
├── resources/        # view templates
├── runtime/
└── composer.json

Entry Point

public/index.php - entry point Yii3
<?php
 
declare(strict_types=1);
 
use Yiisoft\Yii\Web\Application;
use Yiisoft\Yii\Web\SapiEmitter;
use Yiisoft\Yii\Web\ServerRequestFactory;
 
require dirname(__DIR__) . '/vendor/autoload.php';
 
$container = require dirname(__DIR__) . '/config/bootstrap.php';
 
/** @var Application $app */
$app = $container->get(Application::class);
$server = $container->get(ServerRequestFactory::class);
$emitter = $container->get(SapiEmitter::class);
 
$request = $server->createFromGlobals();
$response = $app->handle($request);
$emitter->emit($response);

Perhatikan perbedaannya dengan Yii2: tidak ada Yii::$app global yang otomatis ada. Semuanya disuntikkan dari container ($container->get(...)) — HTTP request dibuat eksplisit, diproses aplikasi, dan di-emit. Ini PSR-7 murni.

Router: Mendefinisikan Route

Di Yii3, routing bukan magic URL — ia daftar route eksplisit di config/packages/router.php:

config/packages/router.php
<?php
 
declare(strict_types=1);
 
use Yiisoft\Router\Group;
use Yiisoft\Router\Route;
use App\Handler\IndexHandler;
 
return [
    'yiisoft/router/urlManager' => [
        'routes' => [
            Group::create('/api')
                ->routes(
                    Route::get('/posts')->action([IndexHandler::class, 'get']),
                    Route::post('/posts')->action([IndexHandler::class, 'create']),
                ),
        ],
    ],
];

Setiap route terdefinisi eksplisit: method HTTP, path, dan handler. Tidak ada resolusi controller otomatis dari URL — desain yang lebih eksplisit dan lebih mudah diaudit.

Handler: Pengganti Controller

"Controller" di Yii3 diganti konsep handler — class yang menerima request dan mengembalikan response:

src/Handler/IndexHandler.php
<?php
 
declare(strict_types=1);
 
namespace App\Handler;
 
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
 
final class IndexHandler
{
    public function get(ServerRequestInterface $request): ResponseInterface
    {
        $response = new \Nyholm\Psr7\Response();
        $response->getBody()->write('Halo dari Yii3!');
 
        return $response;
    }
}

Handler adalah kode PHP murni dengan dependency injection via constructor — mudah ditest, mudah dipahami, dan tidak bergantung pada state global.

Mode Worker: RoadRunner dan FrankenPHP

Salah satu daya tarik terbesar Yii3 adalah dukungan worker mode: aplikasi PHP dimuat sekali ke memori, lalu menangani banyak request tanpa re-inisialisasi per request. Perbedaan performanya dramatis — menghilangkan overhead bootstrap yang biasanya diulang jutaan kali.

RoadRunner

RoadRunner (Go-based app server) menjalankan worker PHP persisten:

Jalankan Yii3 dengan RoadRunner
composer require spiral/roadrunner-cli
./vendor/bin/rr get
./rr serve -c .rr.yaml
.rr.yaml
server:
  command: "php public/index.php"
  relay: "pipes"
 
http:
  address: "0.0.0.0:8080"
  pool:
    num_workers: 8
    max_jobs: 1000
 
rpc:
  listen: "tcp://127.0.0.1:6001"

FrankenPHP

FrankenPHP menawarkan pendekatan berbeda: PHP terintegrasi langsung dengan Caddy web server — tanpa Nginx, tanpa PHP-FPM terpisah:

Jalankan Yii3 dengan FrankenPHP
frankenphp php-server -r public
Dockerfile - FrankenPHP
FROM dunglas/frankenphp
 
COPY . /app
WORKDIR /app
 
CMD ["frankenphp", "php-server", "-r", "public"]

Tip

Kapan memakai worker mode? Untuk aplikasi dengan traffic tinggi dan logika berat per request (banyak query, perhitungan besar), worker mode memberi percepatan 2-5x karena bootstrap framework dihilangkan. Untuk aplikasi kecil atau yang traffic-nya rendah, PHP-FPM biasa sudah lebih dari cukup. Ukur dulu, optimalkan kemudian — jangan tambah kompleksitas tanpa data.

Membandingkan Yii2 dan Yii3

AspekYii 2.0Yii3
StrukturSatu package monolitikPackage yiisoft/* per bagian
VersiSatu versi untuk semuaSemVer per-package
PHP7.4+ (rekomendasi 8.2+)8.2+ wajib
HTTPSAPI bawaan + app global Yii::$appPSR-7 + DI container eksplisit
RoutingMagic URL → controller/actionRoute eksplisit → handler
Worker modeTidak didukung (FPM)RoadRunner, FrankenPHP
DukunganKeamanan hingga Nov 2027Hingga 2035 (freeze fitur 2030)

Poin terpenting untuk kalian yang sudah mahir Yii2: konsep yang kalian kuasai — Active Record, migrasi, i18n, RBAC, queue — tetap relevan. Yang berubah adalah container tempat mereka duduk: dari aplikasi global ke package yang dirakit. Migrasi dari Yii2 ke Yii3 bukan upgrade satu baris, melainkan rewrite parsial yang memanfaatkan skill yang sudah ada.

Praktik: Merakit Aplikasi Yii3

Satukan langkah-langkah di atas dalam satu alur nyata:

Bootstrap aplikasi Yii3 minimal
composer create-project --prefer-dist yiisoft/app learn-yii3-app
cd learn-yii3-app
composer install
php -S 127.0.0.1:8080 -t public    # server bawaan untuk development
Verifikasi route dan handler
curl -s http://127.0.0.1:8080/api/posts
# Halo dari Yii3!

Tambahkan koneksi database dengan yiisoft/db-mysql, definisikan di config/packages/db.php, dan aplikasi Yii3 kalian mulai berbicara dengan database — menggunakan Active Record yang sintaksnya akrab dari Yii2.

Penutup

Inti yang harus dibawa pulang:

  • Yii3 (rilis 31 Des 2025) = ekosistem package yiisoft/* dengan SemVer per-package, bukan satu versi framework.
  • Aplikasi minimal dirakit: DI container (yiisoft/di) → aplikasi → router → handler.
  • Handler menggantikan controller; route didefinisikan eksplisit, bukan magic URL.
  • Worker mode (RoadRunner, FrankenPHP) menghilangkan bootstrap per request — percepatan besar di traffic tinggi.
  • Migrasi Yii2 → Yii3 adalah rewrite parsial; konsep (AR, migrasi, RBAC) tetap dibawa.
  • Dukungan Yii3 hingga 2035 (freeze fitur 2030); Yii2 aman hingga Nov 2027.

Di episode 24 selanjutnya, kita memperbesar skala: scaling & high availability — membuat aplikasi stateless, memanfaatkan Redis untuk cache dan session, read replicas untuk query berat, horizontal scaling dengan load balancer, serta mengukur performa dengan load test dan tuning PHP-FPM. Sampai jumpa di episode 24!

Belajar Yii - Yii3: Package-Based Architecture | Belajar Yii