Symfony 2 作為企業級 PHP 框架標桿,擁有嚴謹的架構設計與豐富的生態系統。本教程基於 Symfony 2.0(歷史版本),記錄在 Ubuntu 環境下的完整安裝、配置、建立 Bundle、路由、控制器、模板全流程,適合初次接觸 Symfony 的開發者建立整體認知。
# 下載 Standard Edition (含 vendors)
wget https://symfony.com/download?v=Symfony_Standard_Vendors_2.0.BETA5.tgz
# 解壓至 Web 根目錄
tar zxvf Symfony_Standard_Vendors_2.0.BETA5.tgz -C /var/www
/var/www/Symfony/
├── app/ # 核心配置目錄
│ ├── cache/ # 快取檔案
│ ├── config/ # 全域配置
│ ├── logs/ # 日誌
│ ├── autoload.php # 自動載入註冊
│ └── AppKernel.php # 核心 Kernel,註冊 Bundle
├── src/ # 應用程式源碼(自建 Bundle 放這裡)
├── vendor/ # 第三方庫
└── web/ # Web 公開入口
├── app.php # 生產環境前端控制器
└── app_dev.php # 開發環境前端控制器
app/cache 和 app/logs 需同時被 Web 伺服器使用者(如 www-data)與目前使用者可讀寫:
# 清空舊快取
rm -rf app/cache/* app/logs/*
# 設定 ACL(需掛載支援 acl 的檔案系統)
sudo setfacl -R -m u:www-data:rwx -m u:$(whoami):rwx app/cache app/logs
sudo setfacl -dR -m u:www-data:rwx -m u:$(whoami):rwx app/cache app/logs
若系統不支援 setfacl,需安裝 acl 套件並確認 /etc/fstab 掛載選項含 acl。
瀏覽器訪問 https://localhost/Symfony/web/config.php,按提示填寫資料庫連線資訊(PDO MySQL)、郵件設定、Locale、Secret 等。完成後會自動生成 app/config/parameters.ini:
[parameters]
database_driver="pdo_mysql"
database_host="localhost"
database_name="symfony"
database_user="symfony"
database_password="symfony"
mailer_transport="smtp"
mailer_host="localhost"
locale="zh_CN"
secret="29f96e9e70c2797cb77dd088d3954d3c38d9b33f"
訪問 https://localhost/Symfony/web/app_dev.php,若出現 Symfony 歡迎頁,代表安裝成功。
php app/console gen:bundle "AcmeHelloBundle" src
交互式提示中選擇:YAML 配置、生成完整目錄結構。
編輯 app/autoload.php:
$loader->registerNamespaces(array(
// ...
'Acme' => __DIR__.'/../src',
// ...
));
編輯 app/AppKernel.php:
public function registerBundles() {
$bundles = array(
// ...
new Acme\HelloBundle\AcmeHelloBundle(),
);
return $bundles;
}
app/config/routing.yml:
homepage:
pattern: /
defaults: { _controller: FrameworkBundle:Default:index }
hello:
resource: "@AcmeHelloBundle/Resources/config/routing.yml"
src/Acme/HelloBundle/Resources/config/routing.yml:
hello:
pattern: /hello/{name}
defaults: { _controller: AcmeHelloBundle:Hello:index, name: 'pu' }
_controller 格式:Bundle名:控制器名:動作名,對應 HelloController::indexAction()。
src/Acme/HelloBundle/Controller/HelloController.php:
namespace Acme\HelloBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
class HelloController extends Controller {
public function indexAction($name) {
// 直接回傳 Response(簡易模式)
// return new Response('Hello '.$name.'!');
// 使用模板引擎(推薦)
return $this->render('AcmeHelloBundle:Hello:index.html.twig', array('name' => $name));
}
}
app/Resources/views/layout.html.twig:
{# app/Resources/views/layout.html.twig #}
{% block title %}Hello Application{% endblock %}
{% block body %}{% endblock %}
src/Acme/HelloBundle/Resources/views/Hello/index.html.twig:
{# src/Acme/HelloBundle/Resources/views/Hello/index.html.twig #}
{% extends '::layout.html.twig' %}
{% block body %}
Hello {{ name }}!
{% endblock %}
模板繼承機制:子模板覆寫父模板的 block,實現佈局復用。
瀏覽器訪問 https://localhost/Symfony/web/app_dev.php/hello/World,頁面顯示「Hello World!」。
| 概念 | 說明 | 對應檔案/位置 |
|---|---|---|
| Bundle | 功能模組單元,獨立目錄含 Controller/View/Resources | src/Acme/HelloBundle/ |
| Controller | 處理請求、協調 Model/View、回傳 Response | Controller/HelloController.php |
| Routing | URL 模式映射到 Controller::Action | Resources/config/routing.yml |
| Template (Twig) | 視圖渲染,支援繼承、區塊、過濾器、自動逃逸 | Resources/views/ |
| Dependency Injection | 服務容器管理物件生命週期與依賴 | Resources/config/services.yml |
Symfony 學習曲線較陡,但其嚴謹的架構與最佳實踐能幫你建立可維護、可擴展的企業級應用。建議從官方文件 The Book 系統性學習,並多動手實作。