2013 年 4 月 20 日四川雅安 7.0 級地震,尋人平台需求迫切。Symfony2 以 Bundle 模組化架構、成熟組件生態、強大的命令列工具,支援極速開發。本文記錄如何在 3 小時內基於 Symfony2 交付支援 PFIF (People Finder Interchange Format) 標準的尋人平台。
| Bundle | 功能 | 專案職責 |
| MopaBootstrapBundle | Bootstrap 頁面結構與模板 | 提供基礎 HTML 架構、樣式、響應式佈局 |
| NelmioApiDocBundle | 自動生成 API 文檔與測試介面 | 產出 PFIF API 文檔、提供線上測試工具 |
| JMSSerializerBundle | 物件序列化 (JSON/XML) | 將 Doctrine Entity 轉換為 PFIF XML/JSON 格式 |
| FOSRestBundle | RESTful API 快速開發 | 建立尋人資料 CRUD API 端點 |
| DoctrineFixturesBundle | 測試資料載入 | 快速灌入模擬尋人資料供開發測試 |
三小時開發關鍵步驟
第 1 小時:專案初始化與核心實體建模
# 1. 建立專案
composer create-project symfony/framework-standard-edition person_finder "2.3.*"
# 2. 設定資料庫 (parameters.yml)
database_driver: pdo_mysql
database_host: 127.0.0.1
database_port: 3306
database_name: person_finder
database_user: pf_user
database_password: secret
# 3. 產生核心 Bundle
php app/console generate:bundle --namespace=Acme/PersonFinderBundle --format=yml
# 4. 定義 PFIF 對應實體 (Person, Note, Source)
# Person.php: person_record_id, first_name, last_name, gender, date_of_birth, ...
# Note.php: note_id, person_record_id, text, timestamp, author_name, ...
# Source.php: domain_name, source_url, ...
使用 php app/console doctrine:generate:entities AcmePersonFinderBundle 生成 Getter/Setter,php app/console doctrine:schema:create 建表。
第 2 小時:API 端點與 PFIF 序列化
- 安裝序列化 Bundle:
composer require jms/serializer-bundle
# 註冊 AppKernel.php
- 配置 JMS Serializer 支援 XML (PFIF 格式):
# config.yml
jms_serializer:
metadata:
auto_detection: true
visitors:
xml:
format_output: true
- 實體加上序列化註解:
/**
* @Serializer\XmlRoot("person")
*/
class Person {
/**
* @Serializer\XmlElement(cdata=false)
* @Serializer\Type("string")
*/
protected $person_record_id;
// ... 其他欄位對應 PFIF 標準
}
- 建立 REST 控制器 (使用 FOSRestBundle):
# PersonController.php
class PersonController extends FOSRestController {
/**
* @Rest\Get("/persons.{_format}")
* @Rest\View(serializerGroups={"pfif"})
*/
public function getPersonsAction() {
return $this->getDoctrine()->getRepository('AcmePersonFinderBundle:Person')->findAll();
}
/**
* @Rest\Post("/persons.{_format}")
*/
public function postPersonAction(Request $request) {
// 反序列化 PFIF XML → Entity → 持久化
}
}
第 3 小時:前端介面、API 文檔與部署
- 安裝 MopaBootstrapBundle 快速佈局:
composer require mopa/bootstrap-bundle
# 配置 twig.yml: form_themes: ['MopaBootstrapBundle::layout.html.twig']
- 啟用 NelmioApiDocBundle 自動生成文檔:
composer require nelmio/api-doc-bundle
# 訪問 /api/doc 即可看到 PFIF API 文檔與測試介面
- 編寫 Twig 模板:列表頁、詳情頁、搜尋表單,整合 Bootstrap 元件。
- 生產環境優化:
php app/console cache:clear --env=prod --no-debug
php app/console assets:install --symlink
php app/console assetic:dump --env=prod
- 部署至 Apache/Nginx + PHP-FPM,配置虛擬主機指向
web/ 目錄。
PFIF 標準關鍵點
- XML 結構:
<person> 根元素,包含 person_record_id、first_name、last_name、gender、date_of_birth、entry_date 等。
<note> 子元素記錄尋人留言,含 note_id、text、timestamp、author_name、source_date。
- 支援
source 元素標註資料來源網域與 URL,利於多平台資料聚合。
經驗總結與最佳實踐
- Bundle 生態是加速關鍵:善用官方/社區 Bundle 避免重複造輪子。
- 慣例優於配置:遵循 Symfony 命名慣例 (Bundle、Entity、Repository、Controller) 減少樣板代碼。
- 開發環境啟用 Profiler:
app_dev.php 內建效能分析、SQL 日誌、請求時間線,極大提升除錯效率。
- 資料庫遷移工具:
DoctrineMigrationsBundle 管理 Schema 版本,團隊協作無痛遷移。
- 生產環境關閉 debug、啟用 opcode cache、配置 CDN、靜態資源版本化。
現代化遷移建議 (Symfony 6/7)
- 使用
symfony new --full 建立專案,內建 Docker、Makefile、GitHub Actions。
- 改用 PHP 8.1+ 屬性 (Attributes) 替代 Doctrine 註解。
- API 平台採用
ApiPlatform 自動生成 GraphQL/REST + Admin 介面。
- 前端可選 Vue/React (通过 Webpack Encore) 或繼續 Twig + Stimulus/Turbo。
- 部署至 Kubernetes (Symfony Cloud / Platform.sh) 享受自動擴縮容。
- 上一篇文章: Apache HTTP Server 2.4.4 源碼編譯安裝完整指南:APR、APR-Util、PCRE 依賴處理
- 下一篇文章: Symfony2 + Doctrine2 + MongoDB 開發 LBS 應用:地理位置查詢深度解析與方案對比
Copyright ©
程式碼之家 All Rights Reserved