Symfony2 是一个强大、灵活且遵循最佳实践的 PHP 框架,它基于“组件”架构,这意味着您可以使用其中的任何一个部分(例如路由、表单、HTTP 内核)来构建自己的项目,而无需使用整个框架。
目录
-
第一部分:环境准备与安装
- 1 系统要求
- 2 安装 Composer
- 3 创建第一个 Symfony2 项目
-
第二部分:项目结构初探
- 1 核心目录解析
- 2
app目录详解
-
第三部分:创建一个简单的“Hello, World!”页面
- 1 创建控制器
- 2 配置路由
- 3 访问页面
-
第四部分:构建一个完整的 CRUD 应用
- 1 创建数据库和实体
- 2 生成 CRUD 代码
- 3 运行与测试
- 4 深入理解生成的代码
-
第五部分:进阶概念与最佳实践
- 1 服务容器
- 2 Twig 模板引擎
- 3 表单组件
- 4 安全组件
-
第六部分:学习资源与总结
第一部分:环境准备与安装
1 系统要求
在开始之前,请确保您的开发环境满足以下要求:
- PHP: 5.3.9 或更高版本 (推荐使用 PHP 5.6 或更高版本以获得更好的性能和安全性)。
- PHP 扩展:
php-ctypephp-iconvphp-mbstringphp-splphp-pdo(用于数据库操作)php-xmlphp-apcu(强烈推荐,用于缓存)
- Web 服务器: Apache 2.2+ 或 Nginx。
- 数据库: MySQL, PostgreSQL, SQLite 等 (PDO 支持的数据库)。
2 安装 Composer
Composer 是 PHP 的依赖管理工具,Symfony2 完全依赖 Composer 来管理其核心库和第三方包。
- 打开终端(命令行工具)。
- 运行以下命令来安装 Composer:
curl -sS https://getcomposer.org/installer | php
- 将 Composer 移动到系统路径,以便全局使用:
sudo mv composer.phar /usr/local/bin/composer
3 创建第一个 Symfony2 项目
我们使用 Symfony 的标准版骨架,它包含了开发一个典型应用所需的一切。
-
在您的 Web 服务器根目录(
/var/www)下,运行以下命令:composer create-project symfony/framework-standard-edition my_project_name
my_project_name是您为项目创建的文件夹名称。
-
命令执行完成后,进入项目目录:
cd my_project_name
-
配置 Web 服务器:您需要配置您的 Web 服务器,将 Web 根目录指向
my_project_name/web文件夹。- Apache: 在您的虚拟主机配置文件中,设置
DocumentRoot /var/www/my_project_name/web。 - Nginx: 在您的 Nginx 配置文件中,设置
root /var/www/my_project_name/web。
- Apache: 在您的虚拟主机配置文件中,设置
-
设置文件权限:Symfony2 需要对
app/cache和app/logs目录写入权限,运行以下命令:# 在项目根目录下执行 sudo setfacl -R -m u:www-data:rwx -m u:`whoami`:rwx app/cache app/logs sudo setfacl -d -R -m u:www-data:rwx -m u:`whoami`:rwx app/cache app/logs
- 如果您不熟悉
setfacl,可以使用一个简单的(但不够安全的)方法:sudo chmod -R 777 app/cache app/logs
- 如果您不熟悉
在浏览器中访问 http://localhost/my_project_name/web/config.php,您应该能看到 Symfony 的配置检查页面,确保所有项都为绿色,然后点击“Configure your application”。
第二部分:项目结构初探
安装完成后,让我们来了解一下 Symfony2 项目的核心结构。
my_project_name/
├── app/ # 应用程序的核心配置和资源
│ ├── cache/ # 缓存目录
│ ├── config/ # 配置文件目录 (最重要!)
│ │ ├── config.yml # 主配置文件
│ │ ├── routing.yml # 路由配置文件
│ │ └── ...
│ ├── logs/ # 日志目录
│ └── Resources/ # 应用级别的模板、CSS 等
├── bin/ # Symfony 命令行工具
├── src/ # 您的 PHP 代码 (控制器、实体、服务等)
├── vendor/ # Composer 下载的第三方库 (不要修改)
├── web/ # Web 服务器根目录 (入口文件 index.php)
└── app.php # 生产环境的入口文件
1 app 目录详解
app/config/: 这是您配置整个应用的地方。config.yml是主配置文件,数据库连接、路由、服务等都在这里定义。app/Resources/: 存放应用级别的资源,比如覆盖默认的模板或 CSS 文件。
2 src 目录
src 目录是存放您自己代码的地方,遵循 PSR-0/PSR-4 自动加载标准,通常按命名空间组织,您的所有控制器可以放在 src/YourBundle/Controller/ 目录下。
第三部分:创建一个简单的“Hello, World!”页面
在 Symfony2 中,一个典型的页面请求流程是:路由 -> 控制器 -> 视图。
1 创建控制器
控制器是处理用户请求并返回响应的 PHP 函数或方法。
-
在
src目录下创建一个命名空间包,AppBundle。- 目录结构:
src/AppBundle/Controller/DefaultController.php
- 目录结构:
-
在
DefaultController.php中编写以下代码:// src/AppBundle/Controller/DefaultController.php namespace AppBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Response; class DefaultController extends Controller { public function helloAction($name) { return new Response('<html><body>Hello '.$name.'!</body></html>'); } }
2 配置路由
路由负责将 URL 映射到特定的控制器方法。
- 打开
app/config/routing.yml文件。 - 在文件末尾添加以下配置:
# app/config/routing.yml hello_world: path: /hello/{name} defaults: { _controller: AppBundle:Default:hello }
path: 定义 URL 模式。{name}是一个占位符,它会作为参数传递给控制器。defaults:_controller是 Symfony2 的约定,它告诉 Symfony 去调用哪个控制器,格式是BundleName:ControllerName:ActionName。
3 访问页面
清除缓存并访问页面。
-
清除缓存 (在项目根目录的终端中运行):
php app/console cache:clear --env=dev
-
在浏览器中访问
http://localhost/my_project_name/web/hello/Symfony。
您应该能看到页面显示:Hello Symfony!
第四部分:构建一个完整的 CRUD 应用
我们来创建一个更实用的应用:一个简单的任务管理器。
1 创建数据库和实体
实体 是一个 PHP 类,用于与数据库表进行交互。
-
创建数据库:
mysql -u root -p -e "CREATE DATABASE symfony_tutorial CHARACTER SET utf8 COLLATE utf8_unicode_ci;"
-
配置数据库连接: 打开
app/config/parameters.yml文件,修改数据库连接信息:# app/config/parameters.yml parameters: database_host: 127.0.0.1 database_port: null database_name: symfony_tutorial database_user: root database_password: your_password -
生成实体: 使用 Symfony2 的命令行工具来生成实体类,在项目根目录运行:
php app/console doctrine:generate:entity --entity="AppBundle:Task" --format=yml
AppBundle:Task是一个简写,表示AppBundle\Entity\Task。- 命令行会提示您输入字段信息:
Field name->taskField type->string(任务描述)Field name->dueDateField type->datetime(截止日期)Field name-> (直接回车,结束)
-
更新数据库: 实体定义好后,需要同步到数据库中。
php app/console doctrine:schema:update --force
您的
task表已经创建在数据库中了。
2 生成 CRUD 代码
Symfony2 提供了强大的命令来自动生成完整的 CRUD 操作。
php app/console doctrine:generate:crud --entity="AppBundle:Task" --route-prefix=task --with-write --format=yml
--entity: 指定要操作的实体。--route-prefix: 为所有生成的路由设置前缀,/task/。--with-write: 生成创建、更新和删除功能。--format: 指定路由配置格式。
3 运行与测试
-
清除缓存:
php app/console cache:clear --env=dev
-
访问应用: 在浏览器中访问
http://localhost/my_project_name/web/task/。
您现在拥有一个功能完整的任务管理界面,可以:
- 列表:查看所有任务。
- 创建:点击 "Create a new entry" 添加新任务。
- 编辑:点击任务行的 "Edit" 修改任务。
- 删除:点击任务行的 "Delete" 删除任务。
4 深入理解生成的代码**
- 控制器:
src/AppBundle/Controller/TaskController.php,这个文件包含了处理所有任务相关请求的方法(indexAction,newAction,editAction等)。 - 模板:
src/AppBundle/Resources/views/Task/,这个目录包含了所有显示给用户的 HTML 模板文件,它们使用 Twig 模板引擎编写。 - 路由:
app/config/routing.yml中自动添加了一组新的路由,用于处理任务的各种操作。
第五部分:进阶概念与最佳实践
1 服务容器
服务容器是 Symfony2 的心脏,它是一个“依赖注入”容器,负责管理您应用中的所有对象(服务),您可以将任何类注册为服务,然后在需要的地方轻松地“注入”它,而不是手动创建 new MyObject(),这使代码更易于测试和维护。
2 Twig 模板引擎
Twig 是 Symfony2 默认的、强大且安全的模板引擎,它允许您在 HTML 中嵌入简单的逻辑,
{{ variable }}: 输出变量。{% for item in items %}: 循环。{% if condition %}: 条件判断。{# 这是注释 #}: 注释。
3 表单组件
Symfony2 的表单组件是其最强大的特性之一,它允许您:
- 在 PHP 中定义表单结构,与控制器逻辑分离。
- 自动生成 HTML 表单。
- 处理数据验证和绑定。
- 轻松地重新渲染表单,包括错误信息。
4 安全组件
Symfony2 的安全组件提供了完整的认证和授权系统。
- 认证: 确认“你是谁?”(通过登录表单)。
- 授权: 确认“你能做什么?”(只有管理员才能删除文章)。
第六部分:学习资源与总结
通过本教程,您已经掌握了 Symfony2 的核心概念:
- 如何安装和配置一个 Symfony2 项目。
- 理解了 MVC(模型-视图-控制器)模式在 Symfony2 中的实现。
- 创建了从简单页面到完整 CRUD 应用的实例。
- 接触了 Doctrine、Twig、表单等核心组件。
Symfony2 的学习曲线相对陡峭,但一旦掌握了其核心思想,您会发现它构建复杂、可维护、可扩展的应用程序的能力是无与伦比的。
推荐学习资源
- 官方文档 (首选):
- Symfony2 官方文档:这是最权威、最全面的资源,虽然有些旧,但核心概念至今仍适用,对于中文学习者,Symfony 官方中文文档 是更好的选择。
- 书籍:
- Symfony2 Cookbook: 提供了大量常见问题的解决方案。
- Learning Symfony2: 一本很好的入门书籍。
- 视频教程:
KnpUniversity 提供了大量高质量的 Symfony 教程。
- 社区:
- Symfony 标签 - Stack Overflow: 当遇到问题时,这里是寻找答案的好地方。
继续探索,不断实践,您将很快成为一名 Symfony2 专家!
