首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Symfony 2 入門教程:從安裝配置到創建第一個 Bundle 完整實戰

     編輯:PHP 相關知識

Symfony 2 入門教程:從安裝配置到創建第一個 Bundle 完整實戰

Symfony 2 是 PHP 企業級開發框架的里程碑版本,引入 Bundle 組件化架構、依賴注入容器、事件分發器、Twig 模板引擎等現代特性。本文以 Ubuntu 環境為例,完整演示從下載安裝、權限配置、數據庫設置、創建 Bundle、路由控制器模板三層架構的 Hello World 實戰。

一、環境準備與安裝

1. 系統要求

  • PHP 5.3.9+ (建議 5.6+/7.x)
  • Composer (依賴管理)
  • PDO、Mbstring、Intl、XML、JSON 擴展
  • Web 服務器:Nginx + PHP-FPM 或 Apache + mod_php

2. 下載安裝 (Standard Edition 含 Vendors)

# 進入 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

二、關鍵權限配置 (Linux 必須)

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

檢查 ACL 支持

# 1. 安裝 acl
sudo apt-get install acl

# 2. 檢查 /etc/fstab 掛載選項包含 acl
# UUID=xxx /var ext4 defaults,acl 0 2
# 若無,需重新掛載或修改 fstab 重啟

三、Web 配置向導 (可選)

瀏覽器訪問 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 頁面即成功。

五、創建第一個 Bundle (核心實戰)

1. 生成 Bundle 骨架

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/

2. 註冊 Bundle (自動完成,手動確認)

// app/AppKernel.php
public function registerBundles() {
    $bundles = array(
        // ... 核心 Bundle
        new Acme\HelloBundle\AcmeHelloBundle(),
    );
    return $bundles;
}

3. 配置自動加載 (Composer PSR-4)

// composer.json (通常已自動)
"autoload": {
    "psr-4": { "": "src/" }
}

六、路由配置 (三層架構)

1. 全局路由引用 Bundle 路由

# app/config/routing.yml
homepage:
    path: /
    defaults: { _controller: FrameworkBundle:Default:index }

acme_hello:
    resource: "@AcmeHelloBundle/Resources/config/routing.yml"
    prefix: /hello

2. Bundle 內部路由定義

# 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
        ));
    }
}

八、模板系統 (Twig)

1. 全局佈局模板

{# app/Resources/views/base.html.twig #}



    
    {% block title %}Hello Application{% endblock %}


    
    
{% block body %}{% endblock %}

2. 頁面模板繼承佈局

{# 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、渲染模板同
RoutingURL 模式映射到 Controller::Action同,支持 YAML/Annotation/XML
Twig編譯型模板引擎、繼承、塊、過濾器、自動轉義類似 Blade / ThinkPHP 模板
Service Container依賴注入容器、管理服務實例、生命周期Laravel IoC / ThinkPHP 容器
Doctrine ORM數據映射器模式、Entity、Repository、DQLLaravel Eloquent (ActiveRecord)

十一、常見問題排查

  • 白屏/500:檢查 app/logs/dev.log、權限、PHP 版本兼容
  • 路由 404:清理緩存 php app/console cache:clear --env=dev、檢查路由前綴
  • 模板找不到:命名規範 BundleName:ControllerName:templateName.html.twig
  • 數據庫連接失敗:檢查 parameters.yml、PDO 擴展、主機防火牆

十二、學習路線建議

  1. 掌握 路由 → 控制器 → 模板 基礎流程
  2. 學習 Twig 語法:變量、過濾器、繼承、宏、表單主題
  3. 理解 服務容器:服務定義、注入、標簽、編譯器
  4. 實戰 Doctrine ORM:實體、關聯、遷移、DQL、生命周期回調
  5. 進階:表單組件、驗證器、安全組件、事件分發、功能測試
  6. 遷移至 Symfony 5/6/7:Flex 結構、PHP 8 特性、現代最佳實踐

注意:Symfony 2 已停止維護 (EOL 2017),新項目請直接使用 Symfony 6.4 LTS 或 7.x,本教程僅供理解經典架構原理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved