Kebesaran Symfony justru paling terasa di luar framework-nya. Lebih dari lima puluh komponen — dari wrapper request OOP hingga debugger variabel — dipublikasikan sebagai paket Composer mandiri yang bisa dipasang di aplikasi PHP apa pun, tanpa kernel Symfony, tanpa Twig, tanpa service container framework. Pada chapter ini kita memetakan komponen-komponen paling populer, memakai http-foundation dan var-dumper secara berdiri sendiri, lalu melihat bagaimana framework dan proyek besar lain membangun di atasnya. Chapter ini ditutup dengan kerangka memilih antara komponen lepas dan framework penuh.

Komponen sebagai Pustaka Mandiri #

Setiap komponen Symfony adalah paket terpisah di Packagist dengan namespace symfony/*. Instalasinya tidak berbeda dari pustaka lain yang kita pelajari di Apa Itu Composer : satu perintah composer require, dan Composer menarik paket beserta dependensinya. Tidak ada syarat memakai framework Symfony penuh — komponen hanyalah pustaka PHP yang kebetulan ditulis oleh orang yang sama dengan framework-nya.

Model ini memberi dua manfaat nyata. Pertama, aplikasi lama atau aplikasi tanpa framework bisa mengadopsi kualitas kode tingkat Symfony sepotong demi sepotong — mulai dari satu komponen debug, misalnya, tanpa migrasi besar. Kedua, komponen dipaksa tetap sehat: karena dipakai di luar framework, komponen tidak boleh bergantung pada kernel atau konfigurasi global yang tidak dimiliki pemasang.

Peta Komponen yang Sering Dipakai #

KomponenPeranAPI utama
symfony/http-foundationWrapper OOP untuk request dan responseRequest, Response, Session
symfony/routingPemetaan URL ke handlerRouteCollection, UrlMatcher
symfony/var-dumperInspeksi variabel terstrukturdump(), dd()
symfony/validatorValidasi nilai dan objectConstraint, ValidatorInterface
symfony/consoleKerangka aplikasi CLICommand, InputInterface
symfony/cacheCache dengan standar PSR-6 dan PSR-16CacheItemPoolInterface
symfony/http-clientHTTP client penuh fiturHttpClient::create()
symfony/dotenvMemuat berkas .envDotenv::createImmutable()

Delapan komponen pada tabel di atas menutup mayoritas kebutuhan aplikasi web biasa. Seluruhnya bisa dicampur sesuka hati: aplikasi bisa memakai http-foundation saja, atau http-foundation plus routing plus validator — kombinasi yang mendekati framework mini buatan kita di section Framework Development.

HttpFoundation Tanpa Framework #

Komponen http-foundation menggantikan kerja manual dengan superglobal — $_GET, $_SERVER, header() — menjadi object bertipe. Instalasinya satu baris:

bash
composer require symfony/http-foundation

Dengan komponen tersebut, skrip front controller murni PHP berubah menjadi kode yang terstruktur dan mudah diuji:

php
<?php
// public/index.php — tanpa framework, hanya komponen
require __DIR__ . '/../vendor/autoload.php';

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

$request = Request::createFromGlobals();

$path = $request->getPathInfo();
if ($path === '/halo') {
    $nama = $request->query->get('nama', 'tamu');
    $response = new Response("Halo, $nama!");
} else {
    $response = new Response('Halaman tidak ditemukan', 404);
}

$response->send();

Mari kita bedah skrip di atas bagian per bagian. Request::createFromGlobals() membaca seluruh superglobal lalu membangun object Request yang merepresentasikan permintaan saat ini. Method $request->getPathInfo() mengembalikan path URL bersih dari query string, dan $request->query->get('nama', 'tamu') membaca parameter ?nama=... dengan nilai bawaan — pengganti $GET['nama'] ?? 'tamu' yang kini berupa method bertipe. Object Response menampung status, header, dan body secara eksplisit; $response->send() baru mengirim semuanya ke browser pada baris terakhir. Karena request dibangun dari superglobal, class yang sama juga bisa diuji dengan new Request([], ['nama' => 'Budi']) — tanpa server web, persis filosofi Request dan Response .

Var-Dumper untuk Debugging #

Fungsi bawaan var_dump() adalah alat debug klasik PHP, namun keluarannya cepat menjadi sulit dibaca begitu struktur data bertingkat. Perhatikan keluaran var_dump() untuk array produk sederhana:

php
<?php
$produk = [
    'nama' => 'Kopi Gayo',
    'harga' => 85000,
    'tag' => ['baru', 'favorit'],
];

var_dump($produk);

Output yang Dihasilkan:

text
array(3) {
  ["nama"]=>
  string(9) "Kopi Gayo"
  ["harga"]=>
  int(85000)
  ["tag"]=>
  array(2) {
    [0]=>
    string(4) "baru"
    [1]=>
    string(7) "favorit"
  }
}

Keluaran tersebut memang informatif — tipe dan panjang setiap nilai tercetak — tetapi tidak ada penomoran baris, tidak ada penanda posisi, dan struktur bertingkat hanya ditandai indentasi. Komponen var-dumper menyediakan dump() dan dd() yang menampilkan data yang sama dalam format yang jauh lebih mudah dijelajahi:

php
<?php
require __DIR__ . '/../vendor/autoload.php';

$produk = [
    'nama' => 'Kopi Gayo',
    'harga' => 85000,
    'tag' => ['baru', 'favorit'],
];

dump($produk);  // output terformat, lengkap dengan lokasi pemanggilan
dd($produk);    // dump() lalu hentikan eksekusi (dump and die)

Fungsi dump() mendeteksi konteks eksekusi: di terminal keluarannya berwarna, di browser keluarannya dirender sebagai panel HTML yang bisa dilipat per kunci. Fungsi dd() menambahkan satu perilaku — menghentikan eksekusi setelah mencetak — sehingga cocok memeriksa nilai di tengah alur yang panjang. Keduanya aman untuk object besar karena tidak merekursif tanpa batas dan menandai referensi melingkar.

Komponen di Balik Framework Lain #

Kualitas komponen Symfony membuatnya menjadi fondasi diam-diam bagi banyak proyek besar di luar ekosistem Symfony sendiri:

ProyekContoh komponen Symfony yang dipakai
Laravelconsole (basis Artisan), http-foundation, var-dumper, mailer, process
Drupalrouting, dependency-injection, http-foundation, yaml
Composerconsole, finder, filesystem, process
phpBBhttp-foundation, routing, yaml

Fakta bahwa Laravel membangun Artisan di atas symfony/console sering mengejutkan pemakai Laravel baru. Artinya, saat kita menjalankan php artisan migrate, kode yang berjalan sebagian besar adalah komponen Symfony — Laravel memberikan lapisan kenyamanan di atasnya. Pelajaran praktisnya: menguasai beberapa komponen inti berarti membawa sebagian keterampilan lintas framework, karena API yang sama bekerja di mana pun.

Versioning dan Rilis Komponen #

Komponen Symfony mengikuti semantic versioning dan menumpang kereta rilis yang sama dengan framework-nya: saat Symfony merilis versi 7.2, seluruh komponen yang terpasang juga naik ke 7.2. Versi mayor menandai perubahan yang merusak kompatibilitas, versi minor menambah fitur tanpa merusak, dan versi patch hanya memperbaiki cacat — aturan yang sama dengan Version Constraints yang kita pakai menulis ^7.2 di composer.json.

Dua akibat praktis dari disiplin ini layak dicatat. Pertama, batasan versi seperti "symfony/cache": "^7.2" menjamin pembaruan patch dan minor aman diterima berkat janji backward compatibility — perbaikan bug dan tambalan keamanan mengalir tanpa perubahan kode di sisi kita. Kedua, karena rilis bugfix dan keamanan (bug and security releases, BTS) keluar secara terjadwal untuk versi minor aktif, aplikasi yang tertinggal beberapa versi masih menerima tambalan — selama versi tersebut belum melewati akhir masa dukungannya.

Memilih Komponen atau Framework Penuh #

Pilihan antara komponen lepas dan framework penuh bukan pilihan benar-salah, melainkan penyesuaian dengan bentuk proyek. Panduan kasarnya:

SituasiPilihan yang masuk akal
Aplikasi web lengkap dengan auth, form, ORMFramework penuh (Laravel/Symfony)
Aplikasi lama yang diperbaiki bertahapKomponen, disisipkan modul demi modul
Tool CLI atau integrasi kecilsymfony/console + http-client saja
API kecil dengan kendali penuh atas strukturMicro-framework (chapter Slim berikutnya)

Aturan praktisnya sederhana: hitung berapa banyak “bagian framework” yang harus kita tulis ulang sendiri. Bila jawabannya hanya routing dan request wrapper, komponen lepas memadai. Bila daftannya bertambah menjadi autentikasi, validasi, migrasi database, dan pengiriman email, framework penuh mulai menghemat lebih banyak waktu daripada biaya keterikatannya.

Ringkasan #

Komponen Symfony membuktikan bahwa framework dan pustaka bukan pilihan biner: http-foundation membungkus superglobal menjadi object, var-dumper menaikkan kualitas debugging, dan seluruhnya dipasang lewat Composer dengan janji kompatibilitas yang disiplin. Model ini juga diadopsi proyek lain — termasuk Laravel dan Composer sendiri. Bab berikutnya melihat pendekatan sebaliknya dari arah yang berbeda: framework yang memulai dari nol dan membiarkan kita memilih sendiri seluruh komponennya — Slim Framework.

Referensi #