Tạo và chạy dự án Symfony
ServBay là giải pháp môi trường phát triển web cục bộ dành cho macOS, tích hợp PHP, Node.js, Python, Go, Java cùng nhiều runtime ngôn ngữ khác, cơ sở dữ liệu như MySQL, PostgreSQL, MongoDB, Redis, và hỗ trợ máy chủ Web Apache cùng Caddy. Tài liệu này hướng dẫn chi tiết cách sử dụng ServBay để nhanh chóng dựng và vận hành một dự án Symfony trên macOS.
Symfony là gì?
Symfony là một framework PHP mã nguồn mở do SensioLabs phát triển, cung cấp bộ công cụ hiệu quả, linh hoạt và mạnh mẽ được dùng để xây dựng các ứng dụng web hiện đại và API. Nó tuân theo các tiêu chuẩn phát triển web tốt nhất, sở hữu nhiều thành phần tính năng như định tuyến, template engine (Twig), xử lý form, xác thực, dependency injection,... giúp đơn giản hóa các tác vụ lập trình web phổ biến.
Những tính năng và ưu điểm chính của Symfony
- Thiết kế mô-đun: Symfony cốt lõi là thư viện các component tái sử dụng, cho phép lập trình viên chọn thành phần phù hợp để xây dựng ứng dụng từ nhỏ gọn tới phức tạp.
- Hiệu suất cao: Kiến trúc tối ưu, cơ chế cache hiệu quả và hỗ trợ các tính năng PHP mới nhất giúp Symfony đạt hiệu năng xuất sắc.
- Cộng đồng mạnh mẽ: Sở hữu cộng đồng phát triển lớn, nhiều Bundle (plugin) bên thứ ba và tài liệu phong phú, vấn đề phát sinh được giải quyết nhanh chóng.
- Linh hoạt: Dễ dàng tích hợp các thư viện, phần mở rộng từ bên thứ ba, thích hợp mọi quy mô và độ phức tạp dự án.
- Ổn định & dễ bảo trì: Tuân thủ chuẩn mực lập trình tốt và mô hình thiết kế, ứng dụng dễ kiểm thử, bảo trì, mở rộng.
Symfony phù hợp để xây dựng từ các API nhỏ đến hệ thống web doanh nghiệp cỡ lớn.
Tạo và chạy dự án Symfony với ServBay
ServBay cung cấp đầy đủ môi trường để chạy dự án Symfony, bao gồm phiên bản PHP phù hợp, Composer, máy chủ web, cơ sở dữ liệu và dịch vụ bộ nhớ đệm. Phần này hướng dẫn bạn dùng các tính năng của ServBay để tạo và cấu hình một dự án Symfony mới.
Yêu cầu trước khi bắt đầu
Trước khi thực hiện, hãy đảm bảo bạn đã hoàn tất các bước chuẩn bị sau:
- Đã cài đặt ServBay: Bạn đã cài và khởi động thành công ServBay trên macOS. Nếu chưa, hãy tham khảo Hướng dẫn cài đặt ServBay.
- ServBay đang hoạt động bình thường: Các dịch vụ cốt lõi của ServBay (Caddy hoặc Apache, và cơ sở dữ liệu cần thiết) đã chạy.
- Nhận thức cơ bản: Hiểu sơ bộ về PHP, Composer và các khái niệm Symfony.
Tạo dự án Symfony
ServBay khuyến nghị lưu các dự án web của bạn tại thư mục /Applications/ServBay/www
nhằm tiện cho việc nhận diện, quản lý dự án.
Kiểm tra Composer đã sẵn sàng
Composer đã được tích hợp trong quá trình cài đặt ServBay và đã thiết lập biến môi trường, bạn không cần cài riêng. Có thể xác nhận Composer hoạt động bằng lệnh sau trong Terminal:
composer --version
Tạo thư mục dự án
Tạo thư mục cho dự án Symfony trong thư mục gốc dự án được khuyến nghị:
bashcd /Applications/ServBay/www mkdir servbay-symfony-app
1
2Tạo skeleton dự án với Composer
Di chuyển vào thư mục dự án vừa tạo và sử dụng Composer để tạo project Symfony dựa trên
website-skeleton
.website-skeleton
là bộ khung chuẩn có sẵn các phụ thuộc cho web-app truyền thống.bashcd /Applications/ServBay/www/servbay-symfony-app composer create-project symfony/website-skeleton .
1
2Composer sẽ tải về mã nguồn Symfony cùng các phụ thuộc vào thư mục này.
Cấu hình khởi tạo
Cấu hình chính của dự án Symfony thường được quản lý qua biến môi trường, lưu trong file .env
ở thư mục gốc dự án.
Cấu hình biến môi trường (
.env
)Mở file
.env
tại gốc dự án, nơi chứa cấu hình môi trường như thông tin kết nối database và chìa khóa ứng dụng. Hãy chỉnh hoặc bổ sung các giá trị phù hợp với nhu cầu và môi trường ServBay của bạn.Đảm bảo những dòng cấu hình sau đã chính xác hoặc điều chỉnh theo thiết lập ServBay:
dotenv# Ví dụ file .env APP_ENV=dev # Môi trường phát triển APP_SECRET=your_secret_key # Thay thế bằng chuỗi bất kỳ (bảo mật) # Thông tin kết nối cơ sở dữ liệu (MySQL là ví dụ, các tùy chọn khác ở dưới) # 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
8Hãy thay
your_secret_key
bằng một chuỗi ngẫu nhiên, bảo mật. Với database, ServBay mặc định user làroot
, password làpassword
(bạn cần thay đổi trên môi trường production). Trong ví dụ sẽ dùng database tênservbay_symfony_app
.
Cấu hình máy chủ web (Website ServBay)
Để truy cập dự án Symfony qua trình duyệt, bạn cần cấu hình một “website” trong ServBay (virtual host). Đường dẫn web gốc Symfony nằm tại thư mục public/
trong dự án.
Vào Control Panel ServBay, chuyển tới phần “Website” (hoặc “Host” nếu phiên bản cũ), thêm một website mới:
- Tên (Name): Đặt tên phân biệt, ví dụ
My Symfony Dev Site
. - Tên miền (Domain): Đặt tên miền phát triển nội bộ, ví dụ
servbay-symfony-test.local
. ServBay sẽ tự thiết lập DNS cục bộ. - Loại website (Website Type): Chọn
PHP
. - Phiên bản PHP (PHP Version): Chọn phiên bản PHP phù hợp với Symfony, nên chọn bản mới nhất ServBay hỗ trợ (như
8.3
). - Web root (Website Root): Cực kỳ quan trọng: Phải trỏ vào
public/
của dự án, ví dụ/Applications/ServBay/www/servbay-symfony-app/public
.
Cấu hình xong hãy lưu và áp dụng thay đổi. ServBay tự động cập nhật cấu hình web-server và sinh chứng chỉ SSL được tin cậy cho tên miền này (Caddy hoặc Apache). Bạn có thể truy cập qua HTTPS ngay lập tức.
Xem chi tiết Thêm website đầu tiên với ServBay.
Thêm code ví dụ cơ bản
Để kiểm tra cấu hình website thành công, hãy thêm một route và controller đơn giản để khi truy cập trang chủ sẽ thấy hiển thị một dòng chữ.
Cấu hình route (
config/routes.yaml
)Sửa file
config/routes.yaml
thêm route/
trỏ vào controllerindex
:yaml# config/routes.yaml index: path: / controller: App\Controller\DefaultController::index
1
2
3
4Tạo controller (
src/Controller/DefaultController.php
)Tạo file mới
src/Controller/DefaultController.php
với nội dung: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 { // Trả về một HTTP response đơn giản return new Response('Hello ServBay and Symfony!'); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18Lớp
DefaultController
đơn giản, khai báo methodindex
với annotation route trỏ tới/
. Khi truy cập đường dẫn này, sẽ trả về chuỗi "Hello ServBay and Symfony!".
Truy cập website
Vào trình duyệt, truy cập URL bạn đã cấu hình: https://servbay-symfony-test.local
. Nếu mọi thiết lập đều đúng, bạn sẽ thấy:
Hello ServBay and Symfony!
Điều này xác nhận dự án Symfony đã chạy thành công trên web server của ServBay. Lưu ý ServBay tạo sẵn chứng chỉ HTTPS cho bạn, nên hãy dùng https://
để truy cập.
Ví dụ về cơ sở dữ liệu và cache
Symfony thường dùng Doctrine ORM cho CSDL quan hệ, Symfony Cache cho cache và NoSQL. ServBay tích hợp sẵn nhiều dịch vụ DB cùng extension PHP tương ứng, dễ dàng sử dụng trong dự án Symfony.
Ví dụ dùng cơ sở dữ liệu quan hệ (Doctrine ORM)
ServBay hỗ trợ MySQL và PostgreSQL. Dưới đây là hướng dẫn cấu hình sử dụng hai loại DB này trong Symfony.
Cấu hình kết nối tới DB
Trong file
.env
ở gốc dự án, bỏ comment và sửa biếnDATABASE_URL
cho đúng loại DB bạn dùng.- Với MySQL: Tài khoản mặc định ServBay là
root
, passwordpassword
, cổng3306
.dotenv# .env DATABASE_URL="mysql://root:[email protected]:3306/servbay_symfony_app?serverVersion=8.0&charset=utf8mb4"
1
2 - Với PostgreSQL: Tài khoản là
root
, passwordpassword
, cổng5432
.dotenv# .env DATABASE_URL="postgresql://root:[email protected]:5432/servbay_symfony_app?serverVersion=13&charset=utf8"
1
2
Đảm bảo đã bật dịch vụ database tương ứng từ Control Panel ServBay (MySQL/PostgreSQL).
- Với MySQL: Tài khoản mặc định ServBay là
Tạo database
Nếu DB
servbay_symfony_app
chưa tồn tại, tạo mới bằng công cụ quản trị DB của ServBay (phpMyAdmin, pgAdmin hoặc tool khác), hoặc dùng lệnh Symfony:bashphp bin/console doctrine:database:create
1Tạo Entity và file Migration
Doctrine Entity tượng trưng cho bảng dữ liệu. Dùng Maker Bundle để tạo Entity và migration file dễ dàng.
- Tạo Entity (ví dụ entity
User
):bashKhai báo thêm trường, ví dụphp bin/console make:entity User
1name
(string),email
(string, unique=yes). - Tạo file migration: Tạo migration file tương ứng với thay đổi Entity:bashFile migration sẽ nằm dưới
php bin/console make:migration
1src/Migrations
.
- Tạo Entity (ví dụ entity
Chạy migration
Áp dụng các migration tạo bảng CSDL:
bashphp bin/console doctrine:migrations:migrate
1Thêm ví dụ thao tác CSDL
Sửa file
src/Controller/DefaultController.php
bổ sung route và method minh họa đọc/ghi dữ liệu bằng Doctrine. Cần injectEntityManagerInterface
.Đảm bảo phương thức khởi tạo của
DefaultController
injectEntityManagerInterface
: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 use Symfony\Component\HttpFoundation\JsonResponse; // For JSON response class DefaultController { private $entityManager; // Inject EntityManagerInterface instance public function __construct(EntityManagerInterface $entityManager) { $this->entityManager = $entityManager; } /** * @Route("/", name="app_index") */ public function index(): Response { return new Response('Hello ServBay and Symfony!'); } // ... Các phương thức khác ... }
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
30Rồi bổ sung các routes mới trong
config/routes.yaml
:yaml# config/routes.yaml # ... Các route khác ... mysql_add_user: path: /mysql-add-user # Hoặc /pgsql-add-user tuỳ loại DB bạn cấu hình controller: App\Controller\DefaultController::addUser mysql_get_users: path: /mysql-users # Hoặc /pgsql-users tùy thuộc DB controller: App\Controller\DefaultController::getUsers
1
2
3
4
5
6
7
8Thêm hai phương thức mới vào
src/Controller/DefaultController.php
: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; // Import 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(); // Demo dữ liệu gắn với thương hiệu ServBay $user->setName('ServBay Demo User'); $user->setEmail('[email protected]'); // Ghi dữ liệu $this->entityManager->persist($user); $this->entityManager->flush(); return new Response('User added successfully!'); } /** * @Route("/get-users", name="app_get_users") */ public function getUsers(): JsonResponse { // Lấy toàn bộ User $users = $this->entityManager->getRepository(User::class)->findAll(); // Đổi thành mảng để trả về dạng JSON $usersArray = []; foreach ($users as $user) { $usersArray[] = [ 'id' => $user->getId(), 'name' => $user->getName(), 'email' => $user->getEmail(), ]; } // Trả về phản hồi dạng 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
66Thử truy cập
- Truy cập
https://servbay-symfony-test.local/add-user
để thêm một user. - Truy cập
https://servbay-symfony-test.local/get-users
để xem danh sách user (dưới dạng JSON).
- Truy cập
Ví dụ cache và NoSQL (Symfony Cache)
ServBay tích hợp sẵn Redis, Memcached, và các PHP extension liên quan - có thể sử dụng Symfony Cache component để thao tác với chúng.
Cấu hình kết nối cache
Thêm thông tin DSN của bộ nhớ đệm vào file
.env
.- Memcached: Cổng mặc định là
11211
.dotenvKiểm tra rằng Memcached đã được bật trong panel ServBay.# .env # ... Other configs ... CACHE_DSN=memcached://127.0.0.1:11211
1
2
3 - Redis: Mặc định cổng Redis là
6379
.dotenvĐảm bảo Redis đã bật trong panel ServBay.# .env # ... Other configs ... CACHE_DSN=redis://127.0.0.1:6379 # Nếu Redis cần password (mặc định ServBay không đặt password): # CACHE_DSN=redis://:[email protected]:6379
1
2
3
4
5
- Memcached: Cổng mặc định là
Thêm ví dụ thao tác cache
Bổ sung code ví dụ sử dụng Symfony Cache từ controller, inject thêm
CacheInterface
.Thêm inject
CacheInterface
trong constructor củaDefaultController
: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; // Thêm thuộc tính cache // Constructor inject CacheInterface public function __construct(EntityManagerInterface $entityManager, CacheInterface $cache) { $this->entityManager = $entityManager; $this->cache = $cache; } // ... other methods ... }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25Thêm route mới vào
config/routes.yaml
:yaml# config/routes.yaml # ... Các route khác ... cache_example: path: /cache-example controller: App\Controller\DefaultController::cacheExample
1
2
3
4
5Tạo method controller tương ứng:
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; } // ... các phương thức khác ... /** * @Route("/cache-example", name="app_cache_example") */ public function cacheExample(): Response { // Thử lấy dữ liệu từ cache $cacheItem = $this->cache->get('my_symfony_cache_key', function (ItemInterface $item) { // Callback này thực hiện khi chưa có data cache $item->expiresAfter(3600); // Cache 1 tiếng // Ví dụ lấy dữ liệu tốn thời gian từ database $data = "Data generated at " . date('Y-m-d H:i:s'); // Trả về giá trị để lưu cache return $data; }); // $cacheItem là dữ liệu lấy từ cache hoặc được tạo mới ở trên $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
48Truy cập thử
- Ghé thăm
https://servbay-symfony-test.local/cache-example
. Lần đầu sẽ chạy callback và lưu cache; các lần sau (chưa hết hạn) đọc trực tiếp từ cache (Memcached hoặc Redis).
- Ghé thăm
FAQ – Câu hỏi thường gặp
Hỏi: Truy cập https://servbay-symfony-test.local
báo lỗi không tìm thấy page hoặc 500?
Trả lời: Kiểm tra các vấn đề sau:
- Đảm bảo ServBay đang thực thi và các dịch vụ website (Caddy hoặc Apache) đã bật.
- Kiểm tra lại cấu hình website trong ServBay, domain
servbay-symfony-test.local
đã đúng và web root trỏ đến/Applications/ServBay/www/servbay-symfony-app/public
. - Xem file log của Symfony (
var/log/dev.log
) để biết chi tiết lỗi. - Trong project root, chạy
composer install
để đảm bảo đã cài mọi dependency. - Kiểm tra PHP version so với yêu cầu của dự án Symfony.
Hỏi: Không kết nối được database?
Trả lời: Kiểm tra các vấn đề sau:
- Database (MySQL/PostgreSQL) đã bật trên ServBay?
- Biến
DATABASE_URL
trong.env
đã đúng user, password, host (127.0.0.1), cổng (MySQL 3306, PostgreSQL 5432), DB name? - User/password đã giống thông số mặc định của ServBay hoặc bạn đã cập nhật?
- Đảm bảo database
servbay_symfony_app
đã được tạo.
Hỏi: Không chạy được lệnh php bin/console
?
Trả lời: Hãy đảm bảo Terminal hiện tại ở đúng thư mục /Applications/ServBay/www/servbay-symfony-app
và PHP của ServBay đã được thêm vào PATH (thường ServBay tự xử lý khi cài). Thử kiểm tra bằng lệnh which php
để chắc chắn đang dùng PHP của ServBay.
Tổng kết
Theo hướng dẫn này, bạn đã cài đặt, cấu hình và vận hành một dự án Symfony cơ bản trên macOS bằng ServBay. ServBay cung cấp đầy đủ mọi thành phần thiết yếu cho phát triển Symfony (PHP, Composer, Web server, DB, cache) và đơn giản hóa quá trình cấu hình môi trường, giúp bạn bắt đầu phát triển ứng dụng nhanh chóng. Bạn có thể mở rộng dự án này để học sâu hơn về Symfony và tận dụng các phần mềm, dịch vụ mở rộng ServBay cung cấp.