故事的开始大概在三年以前,一篇最流行 PHP 框架的文章介绍了 Laravel 这个框架,阴差阳错的我去 Github 上印证文中提到的框架时却结识了 Symfony 这个框架(或者叫它 Symfony 组件合集更恰当)。
开始时还是挺困难的,原因有两个:
一,没有中文文档。就硬着头皮看英文的,还自己翻译了Symfony 2.1 The book。
二,原生和传统 PHP 框架与它差异巨大。它的概念完全颠覆了以往的任何时候所获得的知识,我开始想用“获益良多”来形容 Symfony 对我的影响,但其实并不是,应该说它彻彻底底的颠覆了我对 PHP,乃至整个 Web 开发的理解。这种颠覆是彻底而且影响深远的。
学 Symfony 都有些啥好处呢?让我说说吧。
一,用 Composer, 用 Composer, 用 Composer,重要的事说三遍。现在任何语言体现现代性的一个标志性构成就是包管理,Java 的 Maven, Python 的 pip,JavaScript 的 npm。由于历史原因,PHP 的包管理工具可谓一波三折,PHP 官方起初想用 Pecl/Pear 作为官方标准推广扩展和类库的管理工具,无奈种种原因并未如愿,效果不佳。但现在不同了,Composer 担负起了历史重任,已经成了事实的包管理标准工具。约翰列侬说:“猫王之前,世界一无所有”,我曾套用这话形容它的作用,“Composer 之前PHP的世界一无所有”。
二,尊重和遵循 PSR 。长久以来,PHP 都以缺少语言标准和广泛的难以维护的代码而被诟病,然而事实上,PHP 已经不再是十年前的那个 PHP 了,它有了丰富的面向对象特性,而且有了 PSR 这样的语言标准。Symfony 不仅遵循 PSR,而且还是此标准的重要推动者和拟定者。
三,设计思想和设计模式。上边之所以提到 Symfony 是个组件合集,是因为它是可以不作为框架而存在的,它的主体功能都是组件化的,可以完全脱离框架而单独被其他 PHP 程序甚至框架使用,典型的例子就是 Laravel, Drupal 这类知名PHP框架和程序的调用。如果你研究过 Laravel 的实现或组成,就能看到底层从内核到请求和响应均是采用了 Symfony 的组件。而这些高度解耦的组件设计,正是建立在 Symfony 优秀的设计模式的基础上的。从某种意义上说,Symfony 不是一个 MVC 框架,虽然它实现了 MVC 模式该有的一切,但它更多的是强调事件监听化(中介模式和观察者模式),依赖注入化或服务容器化(依赖注入模式),Console组件(命令模式),Doctrine Repository(资源库模式),除了这些它自身的实现也使用了大量的工厂模式、外观模式、组合模式、建造者模式、享元模式等等,这些设计模式或直接或间接的让用户浸入在如此优秀的设计思想当中。
四,涵盖事无巨细,让人大开眼界。从最本质的 http 请求和响应,到系统架构性能优化指导,从单元测试到后期部署,从用户验证到表单验证,再到 xss, csrf, SQL注射,让你区分啥是数据库模型层缓存,啥是Http缓存,啥是PHP文件缓存,啥又是反向代理缓存,怎么用Monolog做程序日志,怎么对做数据的序列化和反序,怎么轻松实现多语言程序,又怎么实现的voter, acls等权限机制,或许你还需用状态机来做过workflow? 我甚至还拿 Browerkit, CssSelector, DomCrawler 这些组件来自己写爬虫,用 Console, ExpresstionLanguage 组件来做内存占用近 1G 的值守进程的自然语言指令解析,也用 Filesystem, Finder 组件试过将几万张分布在不同目录的图片一次导入数据库,再用Web界面人工标记打分这些图片,再一次性将打分结果生成Json文件放到各自目录中去。没说的事情还有很多,这样的收货似乎也一直没有间断过,直到现在如果你问我是不是已经精通 Symfony 了,我只能告诉你“略懂,略懂”,真要用一个词来形容 Symfony,我只能想到“博大精深”。
五,精彩绝伦的三方库。三方库大概可以分为三种:component/bundle(组件/包),platform(平台)和application(整体程序)。这三种可能是耦合在一起的,范围从小到大,先说第一种组件和包。
1,Bundle,就在 Symfony 官网的底部有一个叫 Bundles 的链接,里边是些官方分离出来或推荐的第三方,官方分离出的Bundle其实不必多说,一定要学习和使用,几乎是必备的。纯粹的三方,包括:
- 著名的用于用户管理的 FOSUserBundle(目前不推荐了)
- Symfony Restful API 四件套之一的 FOSRestBundle
- 出身 Admin 管理高度灵活到“无所不能”的 SonataAdminBundle
- 高度抽象的菜单实现类库 KnpMenuBundle
- 让 Doctrine 方便解决很多实际场景功能的 StofDoctrineExtensionsBundle (如 Tree, 软件,Slug化,可追述等等)
- 自动缩略图化利器 LiipImagineBundle
- Restful API 四件套的文档工具 NelmioApiDocBundle
- 让前端使用后台路由的 FOSJsRoutingBundle
- 使用方便的后台CRUD工具 EasyAdminBundle
这些三方 Bundle 都非常的不错,每种都有其适合的场景,都应该学习一遍,即时用不到,也该知道和了解。上边只是官方推荐给大家的,而好用的 Bundle 还不止这些,比如:
- 用于数据迁移的 DoctrineMigrationsBundle
- JMS的全系Bundle(用于安全增强、序列化增强、依赖注入增强等功能)
- 用于分页的 KnpPaginatorBundle
- 填充测试数据超方便的 HautelookAliceBundle 。
事实上,我根本没法说清楚到底有多少好用的第三方 Bundle,因为实在太多,官方推荐和我个人尝试过的其实代表不了什么,也许你该去 http://knpbundles.com/ 自己看看到底有多少以及你到底需要哪些,又或许这个网站也代表不了什么,或许你该去 https://packagist.org/ 看看到底有哪些真正流行的和你需要的包和库。这也是我上边说的为什么 Symfony 的解耦那么重要,使用 Composer 那么重要的原因,就像蝴蝶效应,这些选择会造成你后期有大量的方便的第三方库和软件包可以供你选择和使用。
2,Platform,平台这个概念介于组件/包和开源程序之间,它不是简单的一个侧重于某种特定功能的组件和包,也不是一种实现了某个方向的软件程序,而是一个为了实现某个方向的程序而抽离出来的一些组件和包的集合。比如:
- 目前我见过开发 Restful API 速度最快的 API Platform。
- eZ System 这个 CMS 的基础平台 eZ Platform
- 牛逼的不要不要的 Oro Platform
3, Application, 其实因为 Symfony 社区非常注重组件化和解耦,所以很多程序里的组件和包非常容易调用使用,所以其实很难界定它们和 Platform 的区别,所以我们只从字面和定位上来区分它们了。基于 Symfony 组件的程序真的非常的多,著名的 Drupal, phpBB, PrestaShop 都或多或少的使用着 Symfony,这些信息你可以从市场占有率了解相关的信息。这里想要着重说的其实是全栈使用 Symfony 的程序,这对于学习 Symfony 和基于这些程序开发更有帮助。
说了 Symfony 这么多的好处,我想讲的故事其实也接近尾声,但我的征程其实才刚刚开始,你的呢 :D
以上。