简介
\Symfony2是一个基于PHP语言的Web开发框架,有着开发速度快、性能高等特点。但Symfony2的学习曲线也比较陡峭,没有经验的初学者往往需要一些练习才能掌握其特性。
\本文通过一个快速开发寻人平台的实例向读者介绍Symfony2框架的一些核心功能和特点。通过阅读本文,你可以通过一些具体的例子了解Symfony2框架的优秀特性和技术特点,从而体会到使用Symfony2框架支持快速网站开发这一优势。
\适合人群
\- 本文适用于希望提高PHP语言的开发技术,或者对Symfony2框架有兴趣的读者。\
- 本文也适用于系统架构师和各类技术决策者。\
1.前言
\在不久前的4月20日,中国四川省雅安地区发生了7.0级地震,累计受灾人数达到200多万。寻人平台在这样的情况下能够起到很大的帮助,而且,寻人平台越早上线,实用价值就越高。
\Symfony2可以用来支持大型网站的建设,在中小型网站的快速搭建和开发上也有着非常好的支持。我借由这次撰文的机会,向大家具体地分享一下我是如何在3个小时内基于Symfony2开发出来一套支持PFIF[^1]格式的网站寻人平台的,希望读者能够对Symfony2的各个组件以及功能产生一些了解。
\[^1]: People Finder Interchange Format(wiki)是一个被广泛使用的开放的数据结构及标准,灾难发生后可以用该标准在不同的组织或网站间交换寻人信息,帮助失去联系的人找到彼此。
\2.Bundle的使用
\Symfony2框架以及相关社区最大的特点之一就是支持Bundle。什么是Bundle呢?简单来说,Bundle就是一种“功能”的抽象。通过把一类具体的问题抽象成一个Bundle,可以把一个系统的逻辑进行切分:Bundle的开发者可以专注在某类问题的解决上,而Bundle的使用者则可以把工作的重心放在自己的业务逻辑上。
\在互联网开发领域,存在着大量可以被抽象的功能。比如用户登录系统,比如新闻评论,比如JS/CSS文件的压缩和合并等等。举个具体的例子,比如用户登录系统,大部分项目对于用户系统的需求其实都是差不多的,但每次要开发新产品的时候,都多多少少会去重新造一整个或一部分用户系统的轮子。而一个专门用来负责管理用户系统的Bundle的出现则会减轻这些项目的开发压力,提高项目质量的同时可以加快项目的整体开发速度。
\Symfony2也支持Bundle。Symfony2的社区有大量由社区进行维护的Bundle,使用这些开源的Bundle可以让我们的项目直接拥有那部分Bundle所提供的功能。
\以下列举了本项目中用到的一些第三方Bundle以及所对应负责的任务。
\Bundle名 | 功能介绍 | 在项目中的职责 |
---|---|---|
MopaBootstrapBundle | 提供基于Bootstrap的页面结构和模板 | 提供页面的基本HTML架构,样式 |
NelmioApiDocBundle | 自动生成API的文档及接口测试工具 | 生成API文档以及接口测试工具,并允许工程师及第三方调用者使用工具测试接口是否正常 |
JMSSerializerBundle | 对象进行序列化工具 | 在接口中,将Doctrine2生成出来的Entity对象转换为Json格式 |
需要安装一个Bundle,通常只需要两步:
\- 使用composer安装这些Bundle\
- 对Symfony2进行配置,开启这些Bundle的支持并且做一些设置工作。\
大部分Bundle通过以上两步就能够被集成进你的项目中,安装这些Bundle只需要修改一些配置文件并且运行一个系统命令即可。
\3.数据库建表
\Symfony2默认使用Doctrine2作为其ORM组件,而Doctrine2允许开发者通过定义一个普通的PHP类,再通过这个类生成相应的表结构(而不是像一些ORM会反过来做,先生成表结构才能生成类文件),所以我们可以通过熟悉的PHP语法来做建表这件事。而Doctrine2也支持Annotation,所以对于具体字段的定义我们就可以放在注释里,比如这个寻人项目中的Person表的定义文件Person.php是这样的:
\\```\\u0026lt;?php\\namespace Scourgen\\PersonFinderBundle\\Entity;\\use Doctrine\\ORM\\Mapping as ORM;\\/**\ * Person\ *\ * @ORM\\Table()\ * @ORM\\Entity(repositoryClass=\"Scourgen\\PersonFinderBundle\\Entity\\PersonRepository\")\ */\class Person\{\ /**\ * @var integer\ *\ * @ORM\\Column(name=\"id\