新一代的PHP框架Zend Framework 2 诞生了,它基于Zend Framework 1,仅支持PHP 5.3,它将在未来一年里取代其旧版本。
因为熟悉Zend Framework 1,我决定进入2.x beta版本,看看有什么变化,并测试对已有的程序是否有影响。
Rob Allen写过一个教程很适合那些从没用过Zend Framework框架的人。你可以通过git克隆(或下一个zip包)来安装框架,并增加一些应用模块。
如果你想玩一个已经写好的框架程序,那么一个包含了实现数据库表的CRUD模块的程序,比起仅仅是“HelloWorld”的程序要好很多。
框架之所以好,是因为它已经包含一些功能模块及.htaccess。所以你只需要在Apache上配置,就可以运行起来。以前,一个新手在创建程序之前都要先配置好Zend Framework 1,我不敢说第一次使用Zend_Tool和ZF都是那么简单。
现在让我们来看看新框架的变化 - 目录结构:
Application/ config/ src/ views/
每个模块代码(类)都是从配置和视图模板中分离的,而不是强迫分开于控制器、模型、服务和其他对象。
这也意味着,理论上你想去掉在一个应用模块,只需要去掉一个单独的文件夹。但这并不意味着模块之间没有关联,例如:两个步骤的视图布局,就可以指定使用其他的模块。这只需要将两个模块的配置合并成一个。
作为一个新的主要版本,该框架也采用新标准,并中断对之前版本的兼容性,就像Symfony 2。
1.仅支持PHP 5.3,使用类的命名空间,不再使用下划线来分隔虚拟包。
2.采用PSR-0 autoloading,所有模块都在src/文件夹下,所以不再匹配类名和文件名。
3.不再有接口后缀的命名。
4.异常采用接口,所以PHP 5.3的异常是由一个模块继承和实现的(例如:Zend\Json\Interface)。
5.不再有下划线前缀来强调私有(private)和保护(protected)的属性和方法。
从上述可见,新标准并没有带来什么革命性的标志,而是它让Coder在写新代码的时候减少了一些负担的。
配置有点长,但控制得当:例如,键名'di',在一个模块的配置文件中包含所有的类及参数。可能有人觉得整个框架变得意外的复杂了,但我们不得不接受,为了使用其全部的特性。
另一个点,我觉得有必要提的是Module.php的配置。它被定义成自动加载的模式,这是很标准的做法。这样我们就不会苦恼于如何加载它们。
控制器相对于Zend Framework 1变得轻量了:它们在注入对象的时候可以指定setter,而不是去搜索周围的对象。这并不是一个什么神奇的功能:因为你可以在配置中指定setter的列表,并将引导你去思考它们的关联性及数量。总的来说控制器减轻了,甚至(理论上)可实例化。
Action返回一个视图模型,所以使他们不需要知道视图对象:
class AlbumController extends ActionController { /** * @var \Album\Model\AlbumTable */ protected $albumTable; public function indexAction() { return array( 'albums' => $this->albumTable->fetchAll(), ); } public function setAlbumTable(AlbumTable $albumTable) { $this->albumTable = $albumTable; return $this; } }
一些惯例和API与Zend Framework 1一致,这意味着你不需要再次学习它们:
1.控制器的API及其助手:在控制器里你可以获得请求,及其他混合特征,如重定向。
2.表单允许定义元素(标签、验证和过滤器),并在子类中提供的初始化方法init()。
3.视图通常遵循文件夹结构<controller>/<action>.phtml;同样$this可调用escape()和url()等视图变量。
基本数据库的支持也是基于Table Data Gateway 类及其扩展。当然你可以选择整合Doctrine2或其他ORMs。
请注意下面的问题:为什么我要使用Zend Framework 2来替代Symfony 2?
提供一个观点:ZF2相对于使用Zend Framework 1的程序来说,有更简单容易的代码升级方式,并且你已经有了ZF的使用经验。此外,它的设计并不落后于Symfony,而且不用全部重写。