Development

Documentation/zh_CN/book/1.0/01-Introducing-Symfony

You must first sign up to be able to contribute.

Version 7 (modified by sebastien.brodbeck, 11 years ago)
--

第 1 章 1 - Symfony介绍

Symfony能做什么? 使用Symfony需要掌握哪些知识? 读完这一章你就知道答案了。

Symfony简介

通过自动化完成一些特定的开发模式,框架能简化应用程序开发。 框架还可以为程序代码增加结构,从而促使程序员编出更好、更易读的、更容易维护的代码。最终,框架大大简化了程序编写,因为它把复杂的操作封装成了简单的声明。

Symfony是一个完整的web应用开发框架,它为加速开发提供了几个关键功能。首先,它把web应用的业务规则,服务器逻辑还有表现页面分割开来。它为减少开发复杂web应用提供了大量的工具、类。另外,它把一些常用的任务变成了自动化的方式从而使开发人员能够完全专注于一项应用任务的细节。这些优点综合起来的结果就是我们每次开发新的web应用的时候不用重新发明轮子了!

Symfony完全由PHP 5编写。它经过了广泛的测试并被用于很多实际的项目中,一些高访问量的电子商务网站正在使用Symfony。Symfony与包括MySQL、PostgreSQL、Oracle还有Microsoft SQL Server在内的大多数数据库系统兼容。Symfony能够在*nix与Windows平台运行。我们现在来看一下Symfony具体有哪些功能。

Symfony的功能

Symfony是为了实现下面的功能而开发的:

  • 能够在在大多数平台上很容易的安装配置 (保证能在标准*nix和Windows平台)
  • 不依赖某种特定的数据库
  • 多数情况下容易使用,并且有足够的弹性来实现更复杂的功能
  • 遵循惯例重于配置原则(convention over configuration)--开发人员只需要配置与惯例不同的部分
  • 能够适应大多数web最优方法(best practices)与设计模式(design patterns)
  • 可供企业使用--能够适应现有的IT策略与体系,并且很稳定适合长期项目
  • 非常易读的代码、带有phpDocumentor注释,维护轻松
  • 易于扩展,允许与非Symfony的库进行整合

自动化Web项目功能

Symfony能够自动化web开发的大部分要素:

  • 内建的国际化层能够实现数据与界面翻译,还有内容本地化。
  • 表现部分由于使用了模版和布局,不懂任何框架知识的网页设计师也可以掌握。辅助函数(helpers)封装了大量的代码从而减少了表现代码的数量。
  • 表单支持自动验证和重新提交,这确保了数据库里的数据的质量,用户体验也更好。
  • 输出转义能够保护程序不受到通过错误数据进行的攻击。
  • 缓存管理功能减轻了带宽和服务器消耗。
  • 使用验证与证书功能能很容易的实现受限制区域还有用户权限管理。
  • 路由与漂亮的URL使网页的网址容易被搜索引擎接受(search-engine friendly)。
  • 内建的e-mail与API管理使web程序超越传统的浏览器交互(browser interactions)。
  • 方便的数据列表提供了自动的分页、排序还有筛选功能。
  • Factories, plug-ins, and mixins provide a high level of extensibility.
  • Ajax交互很容易实现,以一行代码(辅助函数helper)去封装跨浏览器支持的Javascript

开发环境与工具

symfony可以完全的定制以满足有自己代码规范与项目管理规则的企业。 它自带了一些开发环境还有多种工具来实现自动化软件工程任务:

  • 代码生成工具非常适合于原形设计与一键式后台管理(one-click back-end administration)。
  • 内建的单元测试与功能测试框架为测试驱动的开发提供了完美的工具。
  • 测试工具条能够把当前页面的所有开发者需要的信息显示出来从而加快调试速度。
  • 命令行借口使两台服务器之间部署自动化。
  • 能够有效地即时更新配置。
  • 记录功能让管理员能够掌握程序的一举一动。

谁开发了Symfony?为什么要开发Symfony?

Symfony的第一个版本由项目发起者同时也是本书的合著者Fabien Potencier于2005年10月发布。Fabien是Sensio (http://www.sensio.com/) 的CEO,Sensio是一个法国对web开发有创新见解的知名网络机构。

早在2003年,Fabien研究了当时的PHP开源开发工具,发现没有一个能够满足上面的这些需求。PHP 5发布的时候,他意识到现有的工具已经都很成熟,很难整合到一个全功能的框架里。随后他花了1年的时间开发了symfony的核心,这个核心基于Mojavi MVC框架,Propel ORM,还有Ruby on Rails的模版辅助函数。

Fabien最初是为了Sensio的项目开发了symfony,因为一个高效的开发框架能大大加快开发效率。它使得开发更直观,开发的程序更健壮更容易维护。这个框架最初在一个女性内衣的零售商的电子商务网站的项目中应用并取得了成功,随后被用到了其他的项目中。

在成功地将symfony运用于几个项目之后,Fabien决定用开源的协议来发布symfony。他之所以这么做是为了把自己的工作成果捐献给了社区,并且收集用户的意见来改进框架,展示Sensio的经验,另外这是一件有意思的事情。

NOTE 为什么是"symfony"而不是"FooBarFramework"呢?因为Fabien想要一个简单的名字,包含代表Sensio的"s"还有代表framework的"f",并且容易记忆,不跟其他的开发工具名字相似。另外,他不喜欢大写字母。尽管不是标准的英语,"symfony"成为了Fabien的选择,并且symfony也是这个项目的名称。另外一个项目名称是"baguette"。

要成为一个成功的开源项目,symfony需要大量的英文文档,这样能使更多的开发者使用symfony。Fabien请Sensio的职员Francois Zaninotto(本书的作者)深入源代码来写电子版的手册。写作花了不少时间,但是当项目公开的时候,它优秀的文档吸引了不少开发者。其余的就什么也不用说了

Symfony社区

当Symfony的网站(http://www.symfony-project.com/)推出后,全世界许许多多的开发者下载、安装、阅读了在线文档,随后去开发了他们的第一个Symfony的程序,社区开始热闹起来。

当时web应用程序开发框框架正在变得流行,开发者们对全功能的PHP开发框架的需求很高。Symfony由于代码质量还有文档的数量成为一个引人注目的解决方案,这也是它对其他框架的优势。很快就有志愿者参与进来,提出修改或增强的意见,校对文档,还有参与到其他一些必要的工作中来。

我们欢迎所有愿意参与的人加入symfony开发,我们提供公开的源代码仓库还有ticket系统。目前symfony的代码主干主要还是Fabien在维护,这保证了代码的质量。

目前,symfony的论坛,邮件列表,还有IRC频道为整个社区提供了很优秀的支持,平均每个问题会有4个回复之多。每天都有人安装symfony,wiki与代码片断部分汇集了大量的用户提交的文档。每个星期平均会出现5新的个symfony项目,这个数字还在不断地增加。

symfony社区是这个框架的第三个力量,我们希望读了本书后你能加入到这个社区中来。

Symfony适合我吗?

不论你是PHP 5专家或Web应用程序开发的新手,你都能用symfony。决定是否使用symfony的主要因素是项目的大小。

如果你想开发一个只有5到10个网页的简单网站,少量的数据库访问,并且不需要保证速度或者提供文档,那么你只要用PHP就够了。这种情况下使用web开发框架并没有太大的价值,而且面向对象或者MVC模型会使开发速度变慢。另外,symfony在只能在CGI模式下运行PHP的虚拟主机环境下并不能很有效率的运作。

另一方面,如果你要开发一个更复杂的有更多业务逻辑的web应用程序,那么单独使用PHP是不够的。如果你打算以后维护或扩展你的应用程序,那么你的代码需要是简洁,易读和高效的。如果你打算在用户界面中方便的使用最新的技术(例如Ajax),你不能只是写几百行Javascript代码。如果你想愉快而且快速的开发,那么单独使用PHP可能会令你失望。上面这些,就是symfony适合你的原因。

当然,如果你是一个专业的web开发人员,你已经知道了web应用框架的所有优点,并且你需要一个成熟的,具有详细文档和一个大的社区支持的we应用框架。那么不要再犹豫,symfony就是你的解决方案。

提示 如果你想看比较直观的演示,建议去symfony的网站上的screencast。看了以后你会发现使用symfony开发是多么快速而愉快。

基本概念

在开始学习symfony之前,有几个概念需要要理解。如果你已经知道OOP、ORM、RAD、DRY、KISS、TDD、YAML还有PEAR你可以跳过本节。

PHP 5

Symfony本身是由PHP 5 (http://www.php.net/) 开发的,symfony专注于利用PHP 5制作网络应用程序。所以,想要彻底地了解symfony框架必须要对PHP 5有十分深刻的理解。

建议熟悉PHP 4但刚刚接触或者不熟悉PHP 5的开发者专注于PHP 5语言的面向对象模型部分。

面向对象程序设计 (OOP)

我们在本章不去详细解释面向对象程序设计(OOP),因为这个话题可以写一本书了。由于symfony大量运用了PHP 5中的面向对象机制,面向对象程序设计(OOP)是学习symfony的先决条件。

维基百科这样解释OOP:

面向对象程序设计(OOP)可以被视作一种在程序中包含各种独立而又互相调用的单位和对象的思想,这与传统的思想刚好相反:传统的面向过程程序设计主张将程序看作一系列函数的集合,或者直接就是一系列对电脑下达的指令。

PHP 5实现了面向对象中的类、对象、方法、继承等。如果你对这些概念不熟悉,建议阅读相关的PHP文档,网址如下 http://www.php.net/manual/zh/language.oop5.basic.php.

魔术方法

PHP对象的一个优势是可以使用魔术方法。 这些个方法可以不需要修改外部代码而重写一个类的默认行为。这使得PHP语法有更少的冗余性和更具有扩展性。这些方法很好识别,为们他们都是以双下划线(__)开始的。

例如, 当显示一个对象的时候, PHP会去暗中去寻找看是否开发者定义过__toString()方法: [php] $myObject = new myClass(); echo $myObject; // Will look for a magic method echo $myObject->__toString();

Symfony使用了魔术方法, 所以你必须完全了解这些概念。 这些在PHP文档中有描述(http://www.php.net/manual/en/language.oop5.magic.php).

PEAR

PEAR是"一个PHP可重用代码的框架和发布系统"。PEAR可以下载、安装、升级及删除PHP脚本。使用PEAR包的时候,不用为了脚本的位置或者怎么找到他们而担心,扩展命令行借口(CLI)也很容易。

PEAR是一个由社区推动的PHP项目,官方发布的PHP中就包含了PEAR。

提示 PEAR网站, http://pear.php.net/, 有PEAR文档与分类的PEAR包下载。

PEAR是最专业的安装PHP库的方法。建议使用PEAR来管理一个由多个项目共用的symfony框架。Symfony的插件(plug-ins)是一种有特殊设置的PEAR包。Symfony本身也可以通过PEAR安装。

使用symfony并不需要懂PEAR命令的语法。你只要知道PEAR的用途还有确定它已经安装好就行了。你可以通过在你的电脑的命令行(CLI)下输入下面面的命令来检查PEAR是否安装:

> pear info pear

这个命令会返回安装在你的电脑上的PEAR的版本。

Symfony项目有自己的PEAR仓库(或频道)。仓库功能只有PEAR 1.4.0以上版本才支持,所以如果你的版本比较老就需要升级。升级PEAR,只要在命令行输入下面的命令就可以了:

> pear upgrade PEAR

对象关系映射(ORM)

数据库是关系型数据库。 PHP5和Symfony是面向对象的。 为了用面向对象的方法访问数据库, 必须用一个接口来表示对象之间的逻辑关系。 这个接口就叫作对象关系映射或者ORM。

ORM是由对象组成,用来访问数据和保持事务关系。 An ORM is made up of objects that give access to data and keep business rules within themselves.

对象/关系的抽象层的其中一个优点是可以不用直接去访问数据库。 它会使用经过优化的模型对象来访问当前的数据库。

这就意味着在项目中期换一套数据库将是很简单的事情。想象一下当你必须为程序写一个原型的时候,客户并不能确定哪种数据库最适合他们。 你可以先使用SQLite来开发程序, 当客户决定使用MySQL, PostgreSQL或者Oracle的时候,我们只要在配置文件中稍作修改就可以正常工作了。

抽象层封装了数据逻辑。 其他程序并不需要了解SQL的查询语句,却依旧能轻松的访问数据库。 那些对数据库开发者专家也很清楚的知道该做些什么。

使用对象而非记录, 用类而非表,还有其他益处: 你能为你的表增加一些新的存取方法。 例如, 你有一个名叫Client的表,有两个字段,分别是FisrstNameLastName, 你也许想直接获得一个完整的姓名。 在面向对象中, 为一个Client类添加一个访问方法,就像这样:

[php]
public function getName()
{
  return $this->getFirstName.' '.$this->getLastName();
}

所有重复数据访问功能和数据的业务逻辑都可以在对象中维护。 例如,有一个用来生成对象的ShoppingCart类。 我们在结帐时想获得一个总价, 你可以加一个 getTotal() 方法,就像这样:

[php]
public function getTotal()
{
  $total = 0;
  foreach ($this->getItems() as $item)
  {
    $total += $item->getPrice() * $item->getQuantity();
  }
  return $total;
}

就这好了,想象一下要写多长的SQL语句才能完成同样的事情!

Propel,另一个开源项目,是当前最好的基于PHP5的对象/关系抽象层。 Symfony框架无缝集成了Propel, 所以本书大多数的数据处理描述都使用了Propel的语法。 本书将描述如何使用Propel对象, 但是更详细的资料可以参考Propel的网站(http://propel.phpdb.org/trac/)。

快速应用程序开发 (RAD)

开发网页程序是一件单调乏味的,慢速的事情。 例如常规软件开发生存周期(like the one proposed by the Rational Unified Process, for instance),要等到有完整的需求才能开始开发, 绘制大量的UML图, 产生了大量的正式文档之前准备阶段的文档(preliminary documentation?)。 这就是一般的开发步速,缺少通用性的程序语言(在能正式看到程序可以用之前不知道要多少次的建立,编译,重起), 最主要的就是客户不会经常改变他们的主意。 (Programming web applications has long been a tedious and slow job. Following the usual software engineering life cycles (like the one proposed by the Rational Unified Process, for instance), the development of web applications could not start before a complete set of requirements was written, a lot of Unified Modeling Language (UML) diagrams were drawn, and tons of preliminary documentation were produced. This was due to the general speed of development, to the lack of versatility of programming languages (you had to build, compile, restart, and who knows what else before actually seeing your program run), and most of all, to the fact that clients were quite reasonable and didn't change their minds constantly.)

今天,商业节奏更快了,客户总是倾向于在制作项目中经常改变他们的需求。 当然, 他们期望开发组能接受他们的需求并且快速更改应用程序的架构。 幸运的是, 使用脚本语言就像Perl和PHP会更容易的去实现这些,例如快速应用程序开发(RAD)和敏捷程序开发。

尽快去建立一个工作原型以便客户可以审阅并且提出问题是一个好方法。如此周而复始,在较短的开发周期发布新的功能(releasing increasingly feature-rich versions in short development cycles)。

The consequences for the developer are numerous。 一个开发者不需要去想在未来如何实现一个新功能。 用最简单的方法去实现需要的功能。 这就是KISS原则的一个很好体现: Keep It Simple, Stupid.

当需求变化或者功能增加的时候, 有时需要重写代码。 这就叫做重构, 这经常发生在网页应用程序开发中。代码会更根据需要改变存放位置。把重复的地方合并到一个地方,这就是Don't Repeat Yourself (DRY)原则。

当程序改变后要去确保依旧能够运行, 这需要一系列的自动测试来完成。 如果写得好的话, 单元测试将是在重构代码后检查的一个好的方法。 一些开发方法学(development methodologies )甚至于规定在编写代码前先写测试--这就使称之为测试驱动开发test-driven development (TDD)。

NOTE 关于敏捷开发还有其一些它原则和好习惯。 一个敏捷开发理论中最有效率的方法叫做极限开发语言(Extreme Programming)(简称XP),XP教材会教你如何去快速而有效的去开发一个程序。 A good starting place is the XP series books by Kent Beck (Addison-Wesley).

Symfony is the perfect tool for RAD. As a matter of fact, the framework was built by a web agency applying the RAD principle for its own projects. This means that learning to use symfony is not about learning a new language, but more about applying the right reflexes and the best judgment in order to build applications in a more effective way.

The symfony project website proposes a step-by-step tutorial illustrating the development of an application in an agile way. It is called askeet (http://www.symfony-project.com/askeet), and is recommended reading for those who want to learn more about agile development.

YAML

来自YAML官方网站 (http://www.yaml.org/) 的定义: YAML是一种直观的能够被电脑识别的的数据数据序列化格式,它并且容易被人类阅读,容易与脚本语言交互的。换种说法,YAML是一种非常简单的类似于XML的数据描述语言,语法比XML简单很多。他在描述可以被转化成数组或者hash的数据是非常有用,例如:

[php]
$house = array(
  'family' => array(
    'name'     => 'Doe',
    'parents'  => array('John', 'Jane'),
    'children' => array('Paul', 'Mark', 'Simone')
  ),
  'address' => array(
    'number'   => 34,
    'street'   => 'Main Street',
    'city'     => 'Nowheretown',
    'zipcode'  => '12345'
  )
);

解析这个YAML将会自动创建下面的PHP数组:

house:
  family:
    name:     Doe
    parents:
      - John
      - Jane
    children:
      - Paul
      - Mark
      - Simone
  address:
    number: 34
    street: Main Street
    city: Nowheretown
    zipcode: 12345

在YAML里面,结构通过缩进来表示,连续的项目通过减号"-"来表示,map结构里面的key/value对用冒号":"来分隔。YAML也有用来描述好几行相同结构的数据的缩写语法,数组用'[]'包括起来,hash用'{}'来包括。因此,前面的这个YAML可以缩写成这样:

house:
  family: { name: Doe, parents: [John, Jane], children: [Paul, Mark, Simone] }
  address: { number: 34, street: Main Street, city: Nowheretown, zipcode: 12345 }

YAML是"Yet Another Markup Language(另一种标记语言)"的缩写,读音"yamel",或者"雅梅尔"。这种格式大约是2001年出现的,目前为止已经有多种语言的YAML解析器。

提示 YAML格式的详细规格可以在YAML官方网站http://www.yaml.org/找到。

如你所见,写YAML要比XML快得多(不需要关闭标签或者引号),并且比'.ini'文件功能更强(ini文件不支持层次)。所以symfony选择YAML作为配置信息的首选格式。在本书你会看到很多YAML文件,不过它很直观你用不着更深入地研究YAML。

总结

Symfony是一个PHP 5 web应用程序开发框架。他在PHP语言的基础上增加了一个新层,为加速开发复杂的web应用程序提供了工具。本书全面介绍symfony的使用,你只需要熟悉并且理解现代编程的基本概念 -- 面向对象程序设计(OOP)、对象关系映射(ORM)还有快速程序开发(RAD)。唯一需要的技术背景是PHP5 的知识。