Tạo và Chạy Dự Án Symfony
ServBay là một môi trường phát triển Web local được thiết kế riêng cho macOS và Windows, tích hợp nhiều runtime ngôn ngữ như PHP, Node.js, Python, Go, Java cùng các hệ quản trị cơ sở dữ liệu như MySQL, PostgreSQL, MongoDB, Redis và hỗ trợ máy chủ Web Apache, Caddy. Hướng dẫn này sẽ chi tiết cách sử dụng ServBay để nhanh chóng xây dựng và vận hành một dự án Symfony trên macOS và Windows.
Symfony là gì?
Symfony là framework PHP mã nguồn mở do SensioLabs phát triển, cung cấp cho lập trình viên bộ công cụ linh hoạt, hiệu quả và mạnh mẽ để xây dựng ứng dụng Web hiện đại và API. Symfony tuân thủ chuẩn mực phát triển Web tốt nhất, cung cấp nhiều thành phần hữu ích như điều hướng (routing), engine template (Twig), xử lý form, xác thực, dependency injection... giúp đơn giản hóa công việc phát triển Web thường gặp.
Những đặc điểm nổi bật và lợi ích của Symfony
- Thiết kế module hóa: Symfony sở hữu thư viện thành phần có thể tái sử dụng. Lập trình viên lựa chọn thành phần phù hợp để xây dựng ứng dụng từ nhẹ đến nặng.
- 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 mới của PHP, giúp Symfony vận hành nhanh chóng.
- Cộng đồng mạnh mẽ: Nhiều lập trình viên tham gia, đa dạng Bundle (plugin) của bên thứ ba, tài liệu phong phú dễ tra cứu khi gặp vấn đề.
- Linh hoạt: Dễ dàng tích hợp nhiều thư viện và extension bên ngoài, thích hợp cho dự án mọi quy mô.
- Ổn định & dễ bảo trì: Tuân thủ quy tắc code sạch và mẫu thiết kế tốt, giúp ứng dụng dễ test, bảo trì và mở rộng.
Symfony phù hợp để xây dựng mọi loại dự án Web từ API nhỏ đến hệ thống doanh nghiệp lớn.
Sử dụng ServBay để tạo và vận hành dự án Symfony
ServBay cung cấp đầy đủ môi trường cho dự án Symfony, bao gồm phiên bản PHP phù hợp, Composer, máy chủ Web cùng nhiều dịch vụ cơ sở dữ liệu và cache. Phần này sẽ hướng dẫn cách tạo một dự án Symfony mới và cấu hình với các tính năng ServBay.
Điều kiện chuẩn bị
Trước khi bắt đầu, hãy đảm bảo bạn hoàn thành các bước sau:
- Cài đặt ServBay: Đã cài đặt và khởi động ServBay trên macOS. Nếu chưa, hãy tham khảo Hướng dẫn cài đặt ServBay.
- ServBay hoạt động ổn định: Các dịch vụ chính (Caddy hoặc Apache, database bạn cần) đã chạy.
- Kiến thức cơ bản: Có hiểu biết nền tảng về PHP, Composer và Symfony.
Tạo dự án Symfony
ServBay khuyến nghị lưu trữ tất cả project website tại thư mục /Applications/ServBay/www
để dễ dàng nhận diện và quản lý.
Kiểm tra Composer khả dụng
Composer đã được ServBay tích hợp khi cài đặt, với biến môi trường được cấu hình sẵn. Bạn không cần cài đặt riêng. Mở Terminal gõ
composer --version
để kiểm tra Composer.Tạo thư mục dự án
Trong thư mục gốc đề xuất, tạo một folder cho dự án Symfony:
bashcd /Applications/ServBay/www mkdir servbay-symfony-app
1
2Tạo dự án Symfony bằng Composer
Truy cập vào thư mục vừa tạo, sử dụng Composer để tạo project Symfony với skeleton
website-skeleton
— chứa các dependency phổ biến cho web truyền thống.bashcd /Applications/ServBay/www/servbay-symfony-app composer create-project symfony/website-skeleton .
1
2Composer sẽ tải core và các package phụ thuộc của Symfony về thư mục hiện tại.
Khởi tạo cấu hình
Cấu hình dự án Symfony chủ yếu qua biến môi trường, lưu trong file .env
tại thư mục gốc dự án.
Cấu hình file môi trường (
.env
)Mở file
.env
tại gốc dự án. Đây là nơi lưu thông tin cấu hình như kết nối database, khóa ứng dụng, v.v. Chỉnh sửa tuỳ nhu cầu.Đảm bảo các thiết lập dưới đây phù hợp với môi trường ServBay:
dotenv# Ví dụ file .env APP_ENV=dev # Môi trường phát triển APP_SECRET=your_secret_key # Thay bằng chuỗi ngẫu nhiên an toàn # Thông tin kết nối CSDL (dùng MySQL làm mẫu, sẽ có hướng dẫn chi tiết phía dưới) # DATABASE_URL="mysql://db_user:db_password@127.0.0.1:3306/db_name?serverVersion=8.0&charset=utf8mb4" # DATABASE_URL="postgresql://db_user:db_password@127.0.0.1:5432/db_name?serverVersion=13&charset=utf8" # DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db"
1
2
3
4
5
6
7
8Thay
your_secret_key
bằng một chuỗi bảo mật. Với database, mặc định ServBay dùng userroot
, passwordpassword
(cần đổi trong môi trường production!). Sử dụng tên database mẫu làservbay_symfony_app
.
Cấu hình máy chủ Web (Website ServBay)
Để truy cập dự án bằng trình duyệt, bạn cần cấu hình "Website" trên ServBay (virtual host). Thư mục public chính của dự án Symfony là public/
.
Mở bảng điều khiển ServBay, vào phần "Website" (hoặc bản cũ gọi là "Host"), thêm site mới:
- Tên (Name): Đặt tên dễ nhận biết, ví dụ
My Symfony Dev Site
. - Domain (Tên miền): Đặt miền phát triển local, ví dụ
servbay-symfony-test.local
. ServBay sẽ tự động định tuyến tới local. - Loại website (Website Type): Chọn
PHP
. - Phiên bản PHP (PHP Version): Chọn phiên bản phù hợp với dự án Symfony, khuyến nghị bản mới ổn định như
8.3
. - Thư mục gốc (Website Root): Cực kỳ quan trọng, phải trỏ đúng vào
public/
— tức là/Applications/ServBay/www/servbay-symfony-app/public
.
Sau khi lưu, ServBay sẽ tự động cập nhật cấu hình máy chủ Web. Mặc định sử dụng Caddy hoặc Apache, tự động cấp và tin tưởng chứng chỉ SSL cho domain local, nên bạn có thể truy cập trực tiếp qua HTTPS.
Xem hướng dẫn chi tiết tại Thêm website đầu tiên trên ServBay.
Thêm ví dụ code cơ bản
Để kiểm tra cấu hình website đã hoạt động ổn, hãy thêm một route và controller đơn giản để hiển thị chuỗi văn bản ở trang chủ.
Cài đặt route (
config/routes.yaml
)Mở file
config/routes.yaml
, chèn cấu hình route cho đường dẫn/
sử dụng controllerindex
:yaml# config/routes.yaml index: path: / controller: App\Controller\DefaultController::index
1
2
3
4Tạo controller (
src/Controller/DefaultController.php
)Trong thư mục
src/Controller/
, tạo file PHP mớiDefaultController.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 response HTTP đơ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
18Controller này tạo một class
DefaultController
với phương thứcindex
gắn với route/
, trả về dòng chữ "Hello ServBay and Symfony!" khi truy cập trang chủ.
Truy cập website
Bây giờ, mở trình duyệt và truy cập domain bạn đã cấu hình trên ServBay: https://servbay-symfony-test.local
. Nếu mọi thứ đúng, sẽ thấy:
Hello ServBay and Symfony!
1
Điều này chứng minh dự án Symfony của bạn đã chạy thành công qua máy chủ Web ServBay. ServBay tự động cấu hình HTTPS, nên hãy dùng https://
để truy cập.
Ví dụ về cơ sở dữ liệu & cache
Symfony thường dùng Doctrine ORM cho database quan hệ, và Symfony Cache xử lý các cache/NoSQL. ServBay hỗ trợ nhiều dịch vụ database lẫn PHP extension, sử dụng hiệu quả trong dự án Symfony.
Ví dụ 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 và sử dụng 2 hệ quản trị này.
Cấu hình kết nối database
Trong file
.env
gốc dự án, bỏ ghi chú đúng dòngDATABASE_URL
theo loại database bạn chọn.- MySQL: User mặc định là
root
, passwordpassword
, cổng3306
. Điều chỉnh phù hợp với ServBay.dotenv# .env DATABASE_URL="mysql://root:password@127.0.0.1:3306/servbay_symfony_app?serverVersion=8.0&charset=utf8mb4"
1
2 - PostgreSQL: User mặc định là
root
, passwordpassword
, cổng5432
.dotenv# .env DATABASE_URL="postgresql://root:password@127.0.0.1:5432/servbay_symfony_app?serverVersion=13&charset=utf8"
1
2
Đảm bảo đã khởi động service phù hợp (MySQL/PostgreSQL) trong điều khiển ServBay.
- MySQL: User mặc định là
Tạo database
Nếu database
servbay_symfony_app
chưa tồn tại, tạo thủ công bằng tool quản lý (phpMyAdmin hoặc pgAdmin trong ServBay), hoặc dùng lệnh Symfony:bashphp bin/console doctrine:database:create
1Tạo Entity và file migration
Doctrine Entity là class đại diện cho bảng database. Dùng Maker Bundle để sinh Entity và migration dễ dàng.
- Tạo Entity (ví dụ
User
):bashLàm theo hướng dẫn, thêm field nhưphp bin/console make:entity User
1name
(string) vàemail
(string, unique=yes). - Tạo migration: Sinh file migration ứng với Entity vừa tạo:bashFile migration chứa SQL tạo bảng, nằm ở
php bin/console make:migration
1src/Migrations
.
- Tạo Entity (ví dụ
Chạy migration
Chạy lệnh áp dụng cấu trúc lên database:
bashphp bin/console doctrine:migrations:migrate
1Thêm ví dụ thao tác dữ liệu
Sửa
src/Controller/DefaultController.php
, thêm route & method demo ghi/đọc database qua Doctrine. Sử dụngEntityManagerInterface
để thao tác.Đầu tiên, đảm bảo constructor của
DefaultController
nhận vàoEntityManagerInterface
: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; // Dùng để trả về JSON class DefaultController { private $entityManager; // Inject EntityManagerInterface qua constructor public function __construct(EntityManagerInterface $entityManager) { $this->entityManager = $entityManager; } /** * @Route("/", name="app_index") */ public function index(): Response { return new Response('Hello ServBay and Symfony!'); } // ... 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
30Tiếp theo, thêm route vào
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ỳ CSDL controller: App\Controller\DefaultController::addUser mysql_get_users: path: /mysql-users # hoặc /pgsql-users controller: App\Controller\DefaultController::getUsers
1
2
3
4
5
6
7
8Thêm các method controller tương ứng 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(); // Dữ liệu mẫu liên quan đến thương hiệu ServBay $user->setName('ServBay Demo User'); $user->setEmail('demo-user@servbay.test'); // Lưu object vào database (chuẩn bị ghi) $this->entityManager->persist($user); // Thực hiện ghi dữ liệu $this->entityManager->flush(); return new Response('Thêm người dùng thành công!'); } /** * @Route("/get-users", name="app_get_users") */ public function getUsers(): JsonResponse { // Truy vấn tất cả User entity từ database $users = $this->entityManager->getRepository(User::class)->findAll(); // Chuyển kết quả sang array để trả về dưới dạng JSON $usersArray = []; foreach ($users as $user) { $usersArray[] = [ 'id' => $user->getId(), 'name' => $user->getName(), 'email' => $user->getEmail(), ]; } // Trả về response kiểu 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
67Truy cập ví dụ
- Truy cập
https://servbay-symfony-test.local/add-user
để thêm một người dùng. - 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 & NoSQL (Symfony Cache)
ServBay tích hợp sẵn Redis và Memcached, cùng PHP extension phù hợp, cho phép dùng Symfony Cache component để tận dụng các dịch vụ này.
Cấu hình kết nối cache
Trong file
.env
, cấu hình đường dẫn truy cập cache.- Memcached: Port mặc định của ServBay là
11211
.dotenvĐảm bảo đã chạy Memcached service trong ServBay.# .env # ... cấu hình khác ... CACHE_DSN=memcached://127.0.0.1:11211
1
2
3 - Redis: Port mặc định là
6379
.dotenvĐảm bảo kích hoạt Redis service trên ServBay.# .env # ... cấu hình khác ... CACHE_DSN=redis://127.0.0.1:6379 # Nếu Redis yêu cầu password (mặc định ServBay là không), cấu hình như sau: # CACHE_DSN=redis://:your_password@127.0.0.1:6379
1
2
3
4
5
- Memcached: Port mặc định của ServBay là
Thêm ví dụ sử dụng cache
Sửa constructor
DefaultController
để nhận thêmCacheInterface
: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; // thuộc tính cache // Inject CacheInterface qua constructor public function __construct(EntityManagerInterface $entityManager, CacheInterface $cache) { $this->entityManager = $entityManager; $this->cache = $cache; } // ... 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
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
5Thêm method controller sử dụng cache:
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; } // ... phương thức khác ... /** * @Route("/cache-example", name="app_cache_example") */ public function cacheExample(): Response { // Lấy dữ liệu từ cache, sinh mới nếu chưa có $cacheItem = $this->cache->get('my_symfony_cache_key', function (ItemInterface $item) { // Nếu cache miss, thực thi đoạn này: $item->expiresAfter(3600); // Cache 1 giờ // Giả lập truy vấn database chậm hoặc sự kiện phức tạp $data = "Dữ liệu sinh lúc " . date('Y-m-d H:i:s'); // Trả về dữ liệu cần cache return $data; }); // $cacheItem là dữ liệu đã cache hoặc vừa sinh mới $output = "Từ 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 ví dụ
- Truy cập
https://servbay-symfony-test.local/cache-example
. Lần truy cập đầu sẽ tạo dữ liệu mới lưu vào cache. Lần sau, chỉ cần cache chưa hết hạn sẽ đọc trực tiếp từ Memcached hoặc Redis.
- Truy cập
Câu hỏi thường gặp (FAQ)
Q: Truy cập https://servbay-symfony-test.local
bị lỗi 404 hoặc 500?
A: Kiểm tra các điểm sau:
- ServBay đã chạy và dịch vụ website (Caddy/Apache) đã khởi động.
- Kiểm tra domain
servbay-symfony-test.local
đã đúng, và "Website Root" chỉ chính xác vào/Applications/ServBay/www/servbay-symfony-app/public
. - Xem log của dự án Symfony (
var/log/dev.log
) để biết chi tiết lỗi. - Chạy
composer install
tại project root để đảm bảo đủ dependency. - Đảm bảo phiên bản PHP phù hợp với Symfony.
Q: Không thể kết nối database?
A: Kiểm tra các điểm sau:
- Đã chạy dịch vụ database (MySQL hoặc PostgreSQL) trong ServBay.
- Địa chỉ, user, password, cổng, tên database trong
.env
đã đúng (user, password, host 127.0.0.1, cổng MySQL 3306 hoặc PostgreSQL 5432). - Chắc chắn user/password trong
.env
trùng với thông tin ServBay. - Database
servbay_symfony_app
đã tạo sẵn.
Q: Không chạy được lệnh php bin/console
?
A: Đảm bảo thư mục hiện tại là /Applications/ServBay/www/servbay-symfony-app
, ServBay đã cấu hình PHP đúng PATH hệ thống (cài đặt ServBay thường tự động xử lý). Có thể kiểm tra bằng which php
trong terminal — kết quả phải là PHP của ServBay.
Tổng kết
Với hướng dẫn này, bạn đã xây dựng, cấu hình và chạy thành công dự án Symfony nền tảng trên macOS cùng ServBay. ServBay cung cấp mọi thành phần cốt lõi cho phát triển Symfony (PHP, Composer, Web server, database, cache), tối giản quá trình thiết lập để bạn tập trung phát triển ứng dụng. Hãy mở rộng dự án này để khám phá thêm nhiều tính năng của Symfony, đồng thời tận dụng đa dạng phần mềm kèm dịch vụ đi kèm từ ServBay.