Membuat project Symfony pertama dengan composer create-project dan Symfony CLI, memahami peran tiap direktori (src, config, templates, migrations, public), menjalankan server dev, serta mengenal bin/console sebagai gerbang utama semua perintah framework.

Setelah di episode 2 kita memahami arsitektur — HttpKernel, MVC, DI container, Event Dispatcher — saatnya menciptakan project nyata. Episode 3 adalah momen penting: instalasi dan pemahaman struktur project. Banyak pemula melewati bagian ini terlalu cepat lalu bingung ketika file berada "di tempat yang tidak terduga".
Struktur project Symfony bukan sekadar konvensi — ia mencerminkan arsitektur episode 2. Direktori config/ berisi konfigurasi container & routes, src/ berisi kode aplikasi, templates/ berisi view. Memahami peta ini akan membuat seluruh episode berikutnya (yang terus merujuk ke file di src/ dan config/) terasa ringan.
Ada dua cara resmi, hasilnya setara:
composer create-project symfony/skeleton my_app "^8.1"
cd my_appsymfony new my_app --version=8.1
cd my_appPerbedaan keduanya tipis: Symfony CLI menambahkan kemudahan seperti integrasi HTTPS lokal dan server dev satu-perintah. Keduanya memakai Symfony Flex di belakang layar, jadi hasilnya project skeleton standar.
my_app/
├── bin/console # pintu masuk semua command Symfony
├── config/ # konfigurasi routing, packages, services
│ ├── packages/ # config per-bundle (di-generate Flex)
│ ├── routes/ # definisi route per-bundle
│ ├── bundles.php # daftar bundle aktif
│ └── services.yaml # konfigurasi service container
├── migrations/ # file migrasi database
├── public/ # document root (index.php, assets)
├── src/ # kode aplikasi: Controller, Entity, dll
│ └── Kernel.php
├── templates/ # template Twig
├── var/ # cache, log (tidak di-commit)
├── vendor/ # dependensi Composer (tidak di-commit)
├── .env # default environment variables
└── composer.json # manifest projectPerhatikan yang membedakan dengan framework lain: public/ adalah satu-satunya direktori yang ter-expose ke web server. Semua logika ada di luar document root — langkah keamanan yang sudah bawaan.
Jalankan server lewat Symfony CLI atau PHP bawaan:
symfony server:startLalu buka https://localhost:8000. Alternatif tanpa Symfony CLI:
php -S localhost:8000 -t publicTip
symfony server:start melakukan dua hal yang membantu di dev: mengarahkan semua request ke public/index.php (rewrite layaknya nginx/apache), dan menyediakan HTTPS lokal otomatis. Untuk kecepatan di episode-episode awal, cukup php -S juga sudah memadai.
bin/console adalah pintu gerbang seluruh command Symfony. Coba beberapa perintah dasar:
php bin/console about # ringkasan versi & environment
php bin/console list # daftar semua command
php bin/console debug:router # daftar semua route
php bin/console cache:clear # bersihkan cache
php bin/console make:controller # buat controller (butuh MakerBundle)make:controller akan kita pakai di episode 4. Jika perintah make:* tidak tersedia, tambahkan MakerBundle:
composer require --dev symfony/maker-bundleMakerBundle menghasilkan boilerplate kode — kita tetap wajib memahami apa yang ia generate, bukan sekadar menekan enter.
Flex memilih recipe berdasarkan distribusi project:
| Distribusi | Isi bawaan | Cocok untuk |
|---|---|---|
symfony/skeleton | Minimal: HttpKernel, Routing, Console | API, microservice, CLI |
symfony/webapp | + Doctrine, Twig, Security, Maker, dll. | Aplikasi web penuh |
Untuk mengikuti series ini, install komponen sesuai kebutuhan di tiap episode (misal composer require doctrine/orm di episode 6). Ini justru mengajarkan peran tiap bundle secara bertahap — lebih baik daripada men-download semua sekaligus tanpa paham.
composer require twig
composer require doctrine/orm
composer require security-bundleFile .env adalah sumber konfigurasi lingkungan — detail penuhnya di episode 16. Untuk sekarang, ketahui yang esensial: APP_ENV=dev mengaktifkan profiler & toolbar, APP_SECRET wajib diubah pada project produksi, dan DATABASE_URL menentukan koneksi database yang dipakai episode 6.
APP_ENV=dev
APP_SECRET=74e2f6d9c0a3b4d8e1f2a3b4c5d6e7f8
DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db"Sebelum lanjut, pastikan semuanya sehat:
php bin/console about
symfony server:status
curl -I http://localhost:8000/about menampilkan versi PHP, Symfony, dan environment aktif. curl -I harus mengembalikan status HTTP/2 200.
Pada episode 3 ini, kalian telah membuat project Symfony pertama dan memahami petanya.
Inti yang harus dibawa pulang:
composer create-project symfony/skeleton atau symfony new.public/ yang ter-expose ke web; sisanya di luar document root.bin/console adalah gerbang semua perintah; make:* butuh MakerBundle..env menyimpan konfigurasi lingkungan; APP_SECRET jangan dibiarkan default di produksi.Di episode 4 selanjutnya kita membangun routing & controllers: attribute #[Route], parameter path dengan requirement, pembatasan method HTTP, tipe-tipe Response (JSON, redirect, file), dan dependency injection ke controller. Sampai jumpa di episode 4!