php app/console generate:bundle --namespace=Acme/StudyBundle
註冊 AppKernel.php、autoload.php (Symfony 3.4+ 使用 Composer PSR-4 自動載入,無需手動註冊)。
# app/config/routing.yml
hello:
path: /hello/{name}
defaults: { _controller: AcmeStudyBundle:Hello:index }
{name} 為動態參數,自動傳遞給控制器。
// src/Acme/StudyBundle/Controller/HelloController.php
namespace Acme\StudyBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
class HelloController extends Controller {
public function indexAction($name) {
// 方案 A: 直接回傳 Response
return new Response('Hello '.$name.'!');
// 方案 B: 使用模板 (繼承 Controller 基類)
return $this->render('AcmeStudyBundle:Hello:index.html.twig', [
'name' => $name
]);
}
}
{# src/Acme/StudyBundle/Resources/views/Hello/index.html.twig #}
{% extends '::layout.html.twig' %}
{% block body %}
Hello {{ name }}!
{% endblock %}
{# app/Resources/views/layout.html.twig #}
{% block title %}Hello Application{% endblock %}
{% block body %}{% endblock %}
| 目錄 | 用途 |
|---|---|
| app/ | 應用配置、快取、日誌、全域模板 |
| src/ | 專案 PHP 代碼 (Bundle) |
| vendor/ | 第三方函式庫 (Composer 管理) |
| web/ | Web 根目錄、靜態資源、前端控制器 |
// web/app.php (生產環境)
require_once __DIR__.'/../app/bootstrap.php.cache';
require_once __DIR__.'/../app/AppKernel.php';
use Symfony\Component\HttpFoundation\Request;
$kernel = new AppKernel('prod', false);
$kernel->handle(Request::createFromGlobals())->send();
開發環境用 app_dev.php (debug=true、WebProfiler)。Apache Rewrite 可隱藏 app.php。
AppKernel.php:註冊 Bundle、載入配置、定義根目錄config/:config.yml (主配置)、routing.yml、環境別配置 config_dev.yml 等cache/、logs/:快取與日誌 (生產環境部署需可寫入)Resources/:全域模板、翻譯檔// app/autoload.php (舊版) / composer.json (現代)
$loader->registerNamespaces([
'Acme' => __DIR__.'/../src',
]);
PSR-4:Acme\StudyBundle\Controller\HelloController → src/Acme/StudyBundle/Controller/HelloController.php。
AcmeStudyBundle/ ├── Controller/ # 控制器 ├── Resources/ │ ├── config/ # 路由、服務配置 │ ├── views/ # 模板 (Controller名/Action名.html.twig) │ └── public/ # 靜態資源 (安裝至 web/bundles/) ├── Tests/ # 單元測試 └── AcmeStudyBundle.php # Bundle 類別
php app/console init:bundle "Acme\TestBundle" src
自動生成骨架:控制器、模板、路由、Bundle 類別。
同一代碼庫、不同配置:
app_dev.php、詳細錯誤、重新編譯、Profilerapp.php、快取優化、僅記錄錯誤// AppKernel.php
public function registerContainerConfiguration(LoaderInterface $loader) {
$loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
}
環境配置繼承:config_dev.yml import config.yml 並覆寫特定設定。
Symfony 頁面建立遵循「路由→控制器→模板」清晰分層。Bundle 封裝功能模組,配置分環境管理,前端控制器統一入口。掌握目錄結構、自動載入、環境機制,能高效開發可維護的應用。