Symfony 2 是 PHP 企業級開發框架的里程碑版本,引入 Bundle 組件化架構、依賴注入容器、事件分發器、Twig 模板引擎等現代特性。本文以 Ubuntu 環境為例,完整演示從下載安裝、權限配置、數據庫設置、創建 Bundle、路由控制器模板三層架構的 Hello World 實戰。
# 進入 Web 根目錄 cd /var/www # 下載 (示例版本 2.8 LTS) wget https://symfony.com/download?v=Symfony_Standard_Vendors_2.8.52.tgz -O symfony.tgz # 解壓 tar zxvf symfony.tgz mv Symfony_Standard_Vendors_2.8.* symfony2 # 目錄結構 /var/www/symfony2/ ├── app/ # 核心配置、緩存、日誌、Kernel ├── src/ # 業務 Bundle 源碼 ├── vendor/ # 第三方庫 (Composer 管理) ├── web/ # 公開入口 (app.php, app_dev.php) └── composer.json
app/cache 和 app/logs 需要 Web 服務器用戶 (www-data) 和當前用戶雙方讀寫:
cd /var/www/symfony2 # 清理舊緩存 rm -rf app/cache/* app/logs/* # 設置 ACL (推薦,需安裝 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 # 臨時方案 (不推薦生產) # sudo chmod -R 777 app/cache app/logs
# 1. 安裝 acl sudo apt-get install acl # 2. 檢查 /etc/fstab 掛載選項包含 acl # UUID=xxx /var ext4 defaults,acl 0 2 # 若無,需重新掛載或修改 fstab 重啟
瀏覽器訪問 https://your-domain/symfony2/web/config.php,按提示配置數據庫、Mailer、Locale、Secret 等,生成 app/config/parameters.yml:
# app/config/parameters.yml
parameters:
database_driver: pdo_mysql
database_host: 127.0.0.1
database_port: 3306
database_name: symfony2
database_user: symfony
database_password: secret
mailer_transport: smtp
mailer_host: 127.0.0.1
mailer_user: null
mailer_password: null
locale: zh_CN
secret: ThisTokenIsNotSoSecretChangeIt
訪問開發環境入口:https://your-domain/symfony2/web/app_dev.php 顯示 Symfony Welcome 頁面即成功。
cd /var/www/symfony2 php app/console generate:bundle --namespace=Acme/HelloBundle --format=yml
交互式向導會詢問 Bundle 名稱、目標目錄、配置格式 (yml/xml/php/annotation),生成:
src/Acme/HelloBundle/ ├── AcmeHelloBundle.php # Bundle 核心類 ├── Controller/ │ └── DefaultController.php # 控制器 ├── Resources/ │ ├── config/ │ │ └── routing.yml # Bundle 路由 │ └── views/ │ └── Default/ │ └── index.html.twig # 模板 └── Tests/
// app/AppKernel.php
public function registerBundles() {
$bundles = array(
// ... 核心 Bundle
new Acme\HelloBundle\AcmeHelloBundle(),
);
return $bundles;
}
// composer.json (通常已自動)
"autoload": {
"psr-4": { "": "src/" }
}
# app/config/routing.yml
homepage:
path: /
defaults: { _controller: FrameworkBundle:Default:index }
acme_hello:
resource: "@AcmeHelloBundle/Resources/config/routing.yml"
prefix: /hello
# src/Acme/HelloBundle/Resources/config/routing.yml
acme_hello_index:
path: /{name}
defaults: { _controller: AcmeHelloBundle:Default:index, name: 'World' }
requirements:
name: "\w+"
// src/Acme/HelloBundle/Controller/DefaultController.php
namespace Acme\HelloBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
class DefaultController extends Controller {
public function indexAction($name) {
// 方式一:直接返回 Response (簡單)
// return new Response('Hello ' . $name . '!');
// 方式二:渲染模板 (推薦)
return $this->render('AcmeHelloBundle:Default:index.html.twig', array(
'name' => $name
));
}
}
{# app/Resources/views/base.html.twig #}
{% block title %}Hello Application{% endblock %}
{% block body %}{% endblock %}
{# src/Acme/HelloBundle/Resources/views/Default/index.html.twig #}
{% extends '::base.html.twig' %}
{% block title %}Hello {{ name }}{% endblock %}
{% block body %}
Hello {{ name }}!
{% endblock %}
https://domain/symfony2/web/app_dev.php/hello/World → 顯示 "Hello World!"https://domain/symfony2/web/app_dev.php/hello/Symfony → 顯示 "Hello Symfony!"| 概念 | 說明 | 對比 ThinkPHP/Laravel |
|---|---|---|
| Bundle | 功能模塊獨立單元 (控制器+模板+路由+實體+測試) | 類似 Laravel Package / ThinkPHP Module |
| Controller | 處理請求、返回 Response、渲染模板 | 同 |
| Routing | URL 模式映射到 Controller::Action | 同,支持 YAML/Annotation/XML |
| Twig | 編譯型模板引擎、繼承、塊、過濾器、自動轉義 | 類似 Blade / ThinkPHP 模板 |
| Service Container | 依賴注入容器、管理服務實例、生命周期 | Laravel IoC / ThinkPHP 容器 |
| Doctrine ORM | 數據映射器模式、Entity、Repository、DQL | Laravel Eloquent (ActiveRecord) |
app/logs/dev.log、權限、PHP 版本兼容php app/console cache:clear --env=dev、檢查路由前綴BundleName:ControllerName:templateName.html.twigparameters.yml、PDO 擴展、主機防火牆注意:Symfony 2 已停止維護 (EOL 2017),新項目請直接使用 Symfony 6.4 LTS 或 7.x,本教程僅供理解經典架構原理。