Membuat dan Menjalankan Proyek Symfony
ServBay adalah lingkungan pengembangan web lokal khusus untuk macOS yang terintegrasi dengan berbagai runtime bahasa seperti PHP, Node.js, Python, Go, Java, serta dukungan database seperti MySQL, PostgreSQL, MongoDB, dan Redis. ServBay juga mendukung web server Apache dan Caddy. Panduan ini akan menjelaskan secara detail bagaimana membangun dan menjalankan proyek Symfony dengan cepat menggunakan ServBay di macOS.
Apa itu Symfony?
Symfony adalah framework web PHP open-source yang dikembangkan oleh SensioLabs. Framework ini dirancang untuk memberikan seperangkat alat canggih, fleksibel, dan efisien bagi pengembang dalam membangun aplikasi web dan API modern. Symfony mengikuti standar praktik terbaik web dan menawarkan aneka komponen fitur seperti routing, engine template (Twig), pengelolaan form, autentikasi, dependency injection, dan banyak lagi, sehingga proses pengembangan web menjadi lebih mudah.
Fitur Utama dan Kelebihan Symfony
- Desain Modular: Inti Symfony berupa library komponen yang dapat digunakan ulang. Pengembang bebas memilih komponen yang dibutuhkan sehingga dapat membangun aplikasi skala ringan hingga enterprise.
- Performa Tinggi: Dengan arsitektur yang dioptimalkan, mekanisme cache yang efektif, serta mendukung fitur terbaru PHP, Symfony menawarkan performa yang sangat baik.
- Komunitas Kuat: Komunitas pengembang besar, banyak bundle (plugin) pihak ketiga, dan dokumentasi yang lengkap membuat solusi mudah ditemukan saat Anda menghadapi masalah.
- Fleksibel: Mudah diintegrasikan dengan berbagai library dan ekstensi lain, cocok untuk proyek dengan tingkat kerumitan dan skala apa pun.
- Stabil & Mudah Dirawat: Mengikuti best practice dan design pattern yang baik sehingga aplikasi mudah diuji, dipelihara, dan dikembangkan.
Symfony sangat cocok untuk membangun berbagai proyek web, mulai dari API kecil hingga sistem enterprise besar.
Membuat dan Menjalankan Proyek Symfony dengan ServBay
ServBay menyediakan environment lengkap untuk menjalankan proyek Symfony, termasuk versi PHP yang dibutuhkan, Composer, web server, serta berbagai layanan database dan cache. Bagian ini akan memandu Anda membuat proyek Symfony baru dan melakukan konfigurasi menggunakan fitur ServBay.
Prasyarat
Sebelum memulai, pastikan Anda telah melakukan hal-hal berikut:
- Instalasi ServBay: Pastikan ServBay telah diinstal dan dijalankan di macOS Anda. Jika belum, silakan lihat Panduan Instalasi ServBay.
- ServBay Berjalan Lancar: Layanan inti ServBay (seperti Caddy/Apache dan database yang diperlukan) sudah berjalan.
- Pengetahuan Dasar: Memahami konsep dasar PHP, Composer, dan Symfony.
Membuat Proyek Symfony
ServBay menganjurkan penyimpanan semua proyek website di folder /Applications/ServBay/www
agar mudah diidentifikasi dan dikelola.
Pastikan Composer Tersedia
Composer sudah terintegrasi saat instalasi ServBay dan telah diatur pada PATH environment Anda, jadi tidak perlu instalasi terpisah. Cek ketersediaan Composer dengan menjalankan perintah
composer --version
di Terminal.Buat Direktori Proyek
Buat folder baru di direktori root yang direkomendasikan untuk proyek Symfony Anda:
bashcd /Applications/ServBay/www mkdir servbay-symfony-app
1
2Membuat Proyek Symfony dengan Composer
Masuk ke folder proyek dan gunakan Composer untuk membuat skeleton proyek berbasis
website-skeleton
. Skeleton ini sudah berisi dependensi umum untuk aplikasi web:bashcd /Applications/ServBay/www/servbay-symfony-app composer create-project symfony/website-skeleton .
1
2Composer akan mengunduh semua file inti dan dependensi Symfony ke direktori tersebut.
Konfigurasi Awal
Konfigurasi inti proyek Symfony pada umumnya dikontrol melalui variabel environment. Variabel ini dapat diatur di file .env
pada root proyek.
Atur Variabel Environment (
.env
)Buka file
.env
di root proyek. Isi file ini berisi konfigurasi seperti koneksi database, secret key aplikasi, dsb. Edit atau tambahkan sesuai kebutuhan.Pastikan beberapa baris berikut telah benar diatur sesuai environment ServBay Anda:
dotenv# Contoh file .env APP_ENV=dev # Mode pengembangan APP_SECRET=your_secret_key # Ganti dengan string acak yang unik, untuk keamanan # Info koneksi database (contoh menggunakan MySQL, penjelasan menyusul) # DATABASE_URL="mysql://db_user:[email protected]:3306/db_name?serverVersion=8.0&charset=utf8mb4" # DATABASE_URL="postgresql://db_user:[email protected]:5432/db_name?serverVersion=13&charset=utf8" # DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db"
1
2
3
4
5
6
7
8Ganti
your_secret_key
dengan string acak yang aman. Untuk database, ServBay secara default menggunakan userroot
dan passwordpassword
(pastikan UBAH kredensial default ini pada environment production). Sebagai contoh, nama database yang digunakan:servbay_symfony_app
.
Konfigurasi Web Server (Situs ServBay)
Agar dapat diakses via browser, Anda perlu menambahkan entry pada fitur "Website" di ServBay. Root web Symfony terletak di folder public/
.
Buka panel kontrol ServBay, navigasi ke bagian “Situs” (atau “Host” pada versi lama), dan tambahkan website baru:
- Nama (Name): Misalnya
My Symfony Dev Site
. - Domain: Contoh
servbay-symfony-test.local
(akan dibuat dan diarahkan otomatis oleh ServBay). - Tipe Website: Pilih
PHP
. - Versi PHP: Pilih versi PHP terbaru yang kompatibel, misal
8.3
. - Root Situs: Harus menunjuk ke folder
public/
di proyek Symfony, isi/Applications/ServBay/www/servbay-symfony-app/public
.
Setelah selesai, simpan dan terapkan perubahan. ServBay akan otomatis update konfigurasi web server. ServBay (baik Caddy maupun Apache) juga secara otomatis membuat dan mempercayai SSL certificate untuk domain lokal Anda, sehingga Anda dapat mengakses situs langsung via HTTPS.
Langkah detail bisa dilihat di Menambahkan Website Pertama di ServBay.
Menambahkan Contoh Kode Dasar
Untuk mengecek apakah konfigurasi sudah benar, kita tambahkan route dan controller sederhana yang menampilkan output pada root situs.
Atur Route (
config/routes.yaml
)Tambahkan entri baru agar route
/
mengarah ke method controllerindex
:yaml# config/routes.yaml index: path: / controller: App\Controller\DefaultController::index
1
2
3
4Buat Controller (
src/Controller/DefaultController.php
)Buat file baru di
src/Controller/DefaultController.php
dan masukkan kode berikut:php<?php // src/Controller/DefaultController.php namespace App\Controller; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; class DefaultController { /** * @Route("/", name="index") */ public function index(): Response { // Mengembalikan response HTTP sederhana return new Response('Hello ServBay and Symfony!'); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18Kode ini membuat class controller sederhana
DefaultController
dengan methodindex
yang terhubung ke path root/
melalui annotation@Route("/")
. Saat mengakses root, method ini mengirimkan response dengan teks "Hello ServBay and Symfony!".
Mengakses Situs
Buka browser Anda dan akses https://servbay-symfony-test.local
. Jika konfigurasi sudah benar, tampilan halaman akan keluar:
Hello ServBay and Symfony!
1
Ini menandakan proyek Symfony Anda telah berjalan sukses lewat web server ServBay. ServBay sudah otomatis mengatur HTTPS, jadi disarankan selalu menggunakan https://
.
Contoh Database & Cache
Symfony biasanya menggunakan Doctrine ORM untuk database relasional dan komponen Symfony Cache untuk sistem caching dan NoSQL. ServBay menyediakan layanan database/cache beserta ekstensi PHP-nya—semua bisa langsung digunakan di proyek Symfony Anda.
Contoh Database Relasional (Doctrine ORM)
ServBay mendukung MySQL dan PostgreSQL. Berikut contoh konfigurasi dan penggunaannya di Symfony.
Atur Koneksi Database
Di file
.env
, hapus tanda komen (uncomment) baris yang sesuai database pilihan Anda, dan atur konfigurasinya.- MySQL: Default user ServBay untuk MySQL adalah
root
, passwordpassword
, port3306
. Contoh konfigurasi:dotenv# .env DATABASE_URL="mysql://root:[email protected]:3306/servbay_symfony_app?serverVersion=8.0&charset=utf8mb4"
1
2 - PostgreSQL: Postgres default: user
root
, passwordpassword
, port5432
.dotenv# .env DATABASE_URL="postgresql://root:[email protected]:5432/servbay_symfony_app?serverVersion=13&charset=utf8"
1
2
Pastikan layanan database MySQL/PostgreSQL sudah aktif pada panel kontrol ServBay.
- MySQL: Default user ServBay untuk MySQL adalah
Membuat Database
Jika database
servbay_symfony_app
belum ada, Anda bisa membuatnya manual lewat phpMyAdmin/pgAdmin (tersedia pada panel ServBay), atau jalankan:bashphp bin/console doctrine:database:create
1Buat Entity dan File Migrasi
Entity mendefinisikan tabel database. Gunakan Maker Bundle untuk membuat entity dan file migrasi database.
- Buat Entity (contoh: entity
User
):bashTambahkan kolom sesuai petunjuk, misal:php bin/console make:entity User
1name
(string),email
(string, unique=yes). - Buat File Migrasi: Untuk menggenerate file migrasi berdasarkan perubahan entity:bashFile migrasi akan muncul di folder
php bin/console make:migration
1src/Migrations
.
- Buat Entity (contoh: entity
Jalankan Migrasi
Terapkan struktur database dengan menjalankan:
bashphp bin/console doctrine:migrations:migrate
1Tambah Contoh Operasi Database
Edit
src/Controller/DefaultController.php
, tambahkan route dan method untuk demonstrasi operasi CRUD sederhana dengan Doctrine. Anda perlu meng-injectEntityManagerInterface
.Pastikan konstruktor controller Anda meng-inject
EntityManagerInterface
:php<?php // src/Controller/DefaultController.php namespace App\Controller; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Doctrine\ORM\EntityManagerInterface; // Import EntityManagerInterface use App\Entity\User; // Import User entity use Symfony\Component\HttpFoundation\JsonResponse; // Untuk response JSON class DefaultController { private $entityManager; // Dependency injection untuk EntityManagerInterface public function __construct(EntityManagerInterface $entityManager) { $this->entityManager = $entityManager; } /** * @Route("/", name="app_index") */ public function index(): Response { return new Response('Hello ServBay and Symfony!'); } // ... method lain ... }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30Tambahkan route baru di
config/routes.yaml
:yaml# config/routes.yaml # ... route lain ... mysql_add_user: path: /mysql-add-user # Atau /pgsql-add-user sesuai database Anda controller: App\Controller\DefaultController::addUser mysql_get_users: path: /mysql-users # Atau /pgsql-users controller: App\Controller\DefaultController::getUsers
1
2
3
4
5
6
7
8Tambahkan method berikut di controller:
php<?php // src/Controller/DefaultController.php namespace App\Controller; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Doctrine\ORM\EntityManagerInterface; use App\Entity\User; use Symfony\Component\HttpFoundation\JsonResponse; class DefaultController { private $entityManager; public function __construct(EntityManagerInterface $entityManager) { $this->entityManager = $entityManager; } /** * @Route("/", name="app_index") */ public function index(): Response { return new Response('Hello ServBay and Symfony!'); } /** * @Route("/add-user", name="app_add_user") */ public function addUser(): Response { $user = new User(); // Data demo terkait ServBay $user->setName('ServBay Demo User'); $user->setEmail('[email protected]'); // Persist untuk siap tulis ke database $this->entityManager->persist($user); // Jalankan penulisan (commit) $this->entityManager->flush(); return new Response('User added successfully!'); } /** * @Route("/get-users", name="app_get_users") */ public function getUsers(): JsonResponse { // Mengambil semua data User dari database $users = $this->entityManager->getRepository(User::class)->findAll(); // Convert ke array untuk JsonResponse $usersArray = []; foreach ($users as $user) { $usersArray[] = [ 'id' => $user->getId(), 'name' => $user->getName(), 'email' => $user->getEmail(), ]; } // Response berupa data JSON return new JsonResponse($usersArray); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67Uji Coba
- Kunjungi
https://servbay-symfony-test.local/add-user
untuk menambah user. - Kunjungi
https://servbay-symfony-test.local/get-users
untuk melihat daftar user (format JSON).
- Kunjungi
Contoh Cache & Database NoSQL (Symfony Cache)
ServBay melengkapi Redis dan Memcached beserta ekstensi PHP-nya sehingga Anda bisa langsung gunakan dengan komponen Symfony Cache.
Atur Koneksi Cache
Di file
.env
, atur koneksi cache.- Memcached: Default port Memcached adalah
11211
.dotenvPastikan Memcached telah dijalankan di ServBay panel.# .env # ... konfigurasi lain ... CACHE_DSN=memcached://127.0.0.1:11211
1
2
3 - Redis: Default port Redis
6379
.dotenvPastikan Redis sudah aktif di panel ServBay.# .env # ... konfigurasi lain ... CACHE_DSN=redis://127.0.0.1:6379 # Jika Redis memakai password (default ServBay TANPA password): # CACHE_DSN=redis://:[email protected]:6379
1
2
3
4
5
- Memcached: Default port Memcached adalah
Tambah Contoh Penggunaan Cache
Edit controller Anda, inject
CacheInterface
.Pastikan konstruktor meng-inject
CacheInterface
:php<?php // src/Controller/DefaultController.php namespace App\Controller; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Doctrine\ORM\EntityManagerInterface; use App\Entity\User; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Contracts\Cache\CacheInterface; // Import CacheInterface class DefaultController { private $entityManager; private $cache; // Tambahan property cache // Konstruktor menerima CacheInterface public function __construct(EntityManagerInterface $entityManager, CacheInterface $cache) { $this->entityManager = $entityManager; $this->cache = $cache; } // ... method lain ... }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25Tambahkan route baru:
yaml# config/routes.yaml # ... route lain ... cache_example: path: /cache-example controller: App\Controller\DefaultController::cacheExample
1
2
3
4
5Tambahkan method controller berikut:
php<?php // src/Controller/DefaultController.php namespace App\Controller; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Doctrine\ORM\EntityManagerInterface; use App\Entity\User; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Contracts\Cache\CacheInterface; use Symfony\Component\Cache\Item\ItemInterface; // Import ItemInterface class DefaultController { private $entityManager; private $cache; public function __construct(EntityManagerInterface $entityManager, CacheInterface $cache) { $this->entityManager = $entityManager; $this->cache = $cache; } // ... method lain ... /** * @Route("/cache-example", name="app_cache_example") */ public function cacheExample(): Response { // Mengambil data dari cache jika ada $cacheItem = $this->cache->get('my_symfony_cache_key', function (ItemInterface $item) { // Jika cache belum ada, block ini dijalankan $item->expiresAfter(3600); // Durasi 1 jam // Simulasikan operasi berat misal ambil data dari database $data = "Data generated at " . date('Y-m-d H:i:s'); // Data yang akan disimpan di cache return $data; }); // $cacheItem berisi data cache (atau data baru jika belum ada) $output = "From Cache: " . $cacheItem; return new Response($output); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48Coba di Browser
- Buka
https://servbay-symfony-test.local/cache-example
. Pada kunjungan pertama callback akan dijalankan dan data disimpan ke cache. Kunjungan berikutnya, selama masa cache belum expired, data langsung diambil dari Memcached/Redis.
- Buka
Tanya Jawab (FAQ)
T: Tidak menemukan halaman atau Error 500 saat mengakses https://servbay-symfony-test.local
, harus bagaimana?
J: Cek beberapa hal berikut:
- Pastikan ServBay sedang berjalan serta layanan website (Caddy/Apache) aktif.
- Cek kembali konfigurasi domain
servbay-symfony-test.local
dan root situs sudah benar menunjuk ke/Applications/ServBay/www/servbay-symfony-app/public
. - Lihat log Symfony di
var/log/dev.log
untuk info error lebih detail. - Jalankan
composer install
di root proyek agar dependensi terpasang. - Pastikan versi PHP sesuai kebutuhan proyek Symfony Anda.
T: Gagal koneksi database, apa solusinya?
J: Cek hal-hal berikut:
- Database MySQL/PostgreSQL telah berjalan (lihat panel ServBay).
- Format
DATABASE_URL
di.env
sudah benar; user, password, host (127.0.0.1
), port (MySQL3306
, PostgreSQL5432
), dan nama database tepat. - Kredensial user/password sudah benar sesuai ServBay (default atau custom).
- Pastikan database
servbay_symfony_app
sudah dibuat.
T: Tidak bisa menjalankan perintah php bin/console
?
J: Pastikan Anda sudah berada di direktori /Applications/ServBay/www/servbay-symfony-app
di terminal, dan PHP milik ServBay sudah prioritas pada PATH (biasanya otomatis saat instalasi). Cek dengan which php
lalu pastikan jalurkan ke PHP dari ServBay.
Kesimpulan
Dengan mengikuti panduan ini, Anda telah berhasil membuat, mengkonfigurasi, dan menjalankan proyek Symfony dasar di macOS dengan ServBay. Semua komponen inti (PHP, Composer, web server, database, cache) telah tersedia dan terintegrasi, sehingga Anda bisa langsung mulai fokus pada pengembangan aplikasi. Selanjutnya, Anda bisa mempelajari fitur Symfony lainnya dan mengeksplor berbagai layanan tambahan yang disediakan oleh ServBay.