<p> 软件框架指一组代码库集合,旨在以一种标准化方式处理应用程序中的所有基本需求,以便使开发人员集中精力进行开发,而不是进行重复劳动。目前有多个开源的 PHP 开发框架可供选择,在所有这些框架中,Zend Framework 也许是最受欢迎的。</p><p> Zend 收到欢迎的原因是它非常重视最佳实践,这一特性对于那些重视可持续性的开发人员来说十分有吸引力。Zend 以一种高度模块化的方式构造框架:大多数 Zend Framework 组件可以完全分离并单独使用,这一点非常吸引只需要用到可用库的其中一部分的开发人员。Zend 的灵活性以及重视最佳实践而产生的良好标准化,使它成为具有广泛用途的实用框架。</p><p> 已经很强大的 Zend Framework 在 V1.5 中又增加了几个全新的组件和组件增强。这些升级使开发复杂的 PHP 应用程序更加简单、更加可维护,这是因为对诸如表单验证例程甚至是前端布局创建等内容实现了标准化。让我们首先看一下Zend_Form 组件以及它提供的全部功能。</p><p> Zend_Form </p><p> Zend Framework 的一个令人兴奋的新增特性就是 Zend_Form 组件。Web 应用程序如果不能接收输入数据并对其进行处理,那么就会变得毫无意义,获得用户数据的最简单方式就是使用表单。当然,在开发与维护一个 Web 应用程序时,表单是最单调乏味的工作:您必须验证收到的全部内容,确保它是您需要的内容,并需要对每个到来的数据片段进行单独处理。所有上述操作都假设您不会生成错误消息并重复所有工作,当然,您肯定会遇到这些问题 ― 如果不能重用代码,手工执行这些工作实在是非常让人畏惧的任务。</p><p> 新的表单组件提供的功能不仅仅是允许您用编程的方法创建一个表单和表单元素。Zend_Form 能够完成复杂的验证并在表单验证失败时在表单中显示错误信息。</p>
<p> </p>
<p> Zend_Form 的使用方法简单明了。首先,将 form 对象实例化,然后设置它的动作和方法。最后,将表单元素添加到 form 对象中,并且对单个表单元素应用表单元素验证器和过滤器。在应用程序中呈现和使用完整的 form 对象,对结果进行验证和过滤。查看清单 1 中的简单表单示例。</p><p> 清单 1. 一个简单的表单</p><p><code> require_once 'Zend/Form.php';<br /> $form = new Zend_Form(array(<br /> 'method' => 'post',<br /> 'elements' => array(<br /> 'name' => array('text', array(<br /> 'required' => true,<br /> 'label' => 'Name',<br /> 'validators' => array('alpha')<br /> )),<br /> 'age' => array('text', array(<br /> 'required' => true,<br /> 'label' => 'Age',<br /> 'validators' => array('digits')<br /> )),<br /> 'submit' => array('submit', array(<br /> 'label' => 'Send'<br /> ))<br /> ),<br /> ));</code></p><p> 清单 1 的结果如图 1 所示。</p><p> 图 1. 表单</p><p><img src="/content/uploadfile/200805/2008053117225649.jpg" onclick="get_larger(this)" alt="Zend Framework V1.5 中的新特性" /></p><p> Zend_Form 附带了下列元素:按钮、复选框、隐藏(hiden)、图片、多选框,多重选择、密码、单选、重置、选择、提交、文本、文本区。Zend_Form 不仅仅限制于附带的元素:内置的 Zend_Form_Element 类允许您创建自己的元素。</p>
<p> </p>
<p> 您可以手动对表单元素进行实例化并把它们连接到表单,或者让表单对象创建并实例化一个新表单元素,使它符合您要求的类型。在将单个元素附加到 form 对象之前或之后,每个元素都可根据需要进行单独配置,并且在呈现完成的表单之前,可以随时将单独的验证器和过滤器集合附加到它们的表单元素中。</p><p> 可以对您的表单元素使用 19 种标准验证类型。这些验证器可以检查您通常需要采集的所有数据类型 ― 从简单的数据类型检验到正则表达式是否匹配电子邮件地址的验证(可配置为确保存在顶级域并有一个 MX 记录)。默认情况下,如果一个验证器返回 false,则剩余的验证检查都将取消,但这个参数也可以对单个验证器进行配置。</p><p> 在清单 1 中,一个 alpha 验证器应用到名字字段中,数字验证器应用到年龄字段中。当您输入的数据未通过这些验证测试时,图 2 中显示了默认情况下发生的情况。</p><p> 图 2 未通过验证测试的表单</p><p><img src="/content/uploadfile/200805/2008053117225764.jpg" onclick="get_larger(this)" alt="Zend Framework V1.5 中的新特性" /></p><p> 准备好验证器之后,下一步将应用过滤器。如果说验证器的作用相当于俱乐部里的保镖,过滤器的作用更象一个造型师:过滤器取出表单元素中的数据,过滤掉您不希望看到的内容并传递剩下的内容。有 12 种标准的内置过滤器,可用于去掉空格、从数值中去掉字母、把文本转换为大写、把特定字符转换为 HTML 项以及删除禁止的标记。如果您知道所需的数据位于字段中,但是这些数据需要进行大量删减和处理,这种情况下应使用过滤器。</p><p> 为了在简单的表单中演示过滤器的作用,将对 elements 数组做一些修改。</p><p> 清单 2. 把过滤器应用到 elements 数组</p>
<p> </p>
<p><code> 'elements' => array(<br /> 'name' => array('text', array(<br /> 'required' => true,<br /> 'label' => 'Name',<br /> 'validators' => array('alpha'),<br /> 'filters' => array('StringToUpper')<br /> )),<br /> 'age' => array('text', array(<br /> 'required' => true,<br /> 'label' => 'Age',<br /> 'validators' => array('digits'),<br /> 'filters' => array('digits')<br /> )),<br /> 'submit' => array('submit', array(<br /> 'label' => 'Send'<br /> ))<br /> ),</code></p><p> 正如您所见,我们增加了一个过滤器把名字字段全部改为大写,并使用另一个过滤器把年龄字段中的非数字内容全部去掉。现在,当我们提交这些值后,我们会看到如下的结果。</p><p> 图 3. 应用过滤器后的表单</p><p><img src="/content/uploadfile/200805/2008053117225802.jpg" onclick="get_larger(this)" alt="Zend Framework V1.5 中的新特性" /></p><p> 当我们单击 Send 后,下列值将通过验证和过滤器,得到如下所示的结果。</p><p> 图 4. 应用验证和过滤器后的表单</p><p><img src="/content/uploadfile/200805/2008053117225844.jpg" onclick="get_larger(this)" alt="Zend Framework V1.5 中的新特性" /></p>
<p> </p>
<p> 当且仅当存在一个数字并且数字中没有插入错误内容,那么在传递到服务器时,年龄输入、过滤器和验证器以及该组合所需的属性才可以真正确保某个值会通过验证。需要注意的是,名字字段通过验证的惟一方式是名字字段必须以 alpha-字符开头,原因是在这种情况下,过滤器不会帮助这个值通过验证器。</p><p> 可以使用几种方式呈现完成的表单。表单有一种可以直接使用或回显的呈现方法。可是,大多数表单使用 Zend_View helper 进行呈现。</p><p> Zend_Layout 和 Zend_View </p><p> Zend Framework V1.5 中新的 Zend_Layout 和增强的 Zend_View 组件经常一起提到,这是有原因的。这两个组件协同工作可以成功地在 PHP 应用程序中将表示从控制器中分离出来,并以一种支持快速开发和维护的方式对表示进行标准化。</p><p> 所有这些意味着什么?</p><p> 这意味着只要您坚持一些原则并保持代码模块化,那么就可以获得一种标准的、更轻松的方式维护一致的前端。</p><p> Zend_Layout 并不需要与 Model-View-Controller (MVC) 一同使用。与 Zend Framework 中的大部分组件一样,Zend_Layout 可以被取出并独立使用,可是,当它与 MVC 一同使用时,它就变成了在 Zend_View 和控制器之间的一个方便的适配器,可以有效地把表示划分为一个两步骤(two-step)视图并使站点布局更具普遍性。</p><p> 无论您是否正使用 MVC 或把Zend_Layout 取出作为独立的组件,必须至少创建一个布局脚本。在其他的实现中有时也称作模板,布局脚本定义了一个 Web 页面的基本前端结构,它们把变量(而不是静态数据)放置在页面上,各个页面显示的数据不尽相同(或者更准确地说,不同的动作所显示的数据是不同的)。布局脚本中占位符变量的填充方式是把布局脚本所需的值分配给布局,告诉布局您希望使用那个特定布局脚本并最终将它呈现为一个页面。</p>
<p> </p>
<p> 实际的呈现过程由 Zend_View 完成。因此就 Zend_Layout 而言,您可以免费获得 Zend_View 的全部功能。布局脚本应通过视图 helper 进行筛选,否则几乎肯定要做错。视图 helper 是集便利性与标准性于一体的重要组件。</p><p> 当完成您的布局脚本后,您可以在您的引导程序中创建一个 Zend_Layout 实例并设置您的布局配置选项。在它以这种方式实例化后,您可以从动作中通过动作 helper 访问并重新配置 Zend_Layout 对象。在动作内部,您可以通过编程方式修改您希望 Zend_Layout 实例使用哪个布局脚本,并重新填充每个布局脚本需要的当前变量。从控制器的角度看,最后发送给用户的所有数据被放入一个适配器中,适配器把这些数据用于完全不同的范围。</p><p> OpenID 和 InfoCard (Web 2.0)</p><p> OpenID 是一个分散式身份识别协议,可跨多个网站使用。它不需要正确的用户名和密码组合,而是提示给用户一个从现有的 OpenID 提供者处得到的 URL 或 XRL。由提供者完成身份验证过程。提供者执行身份验证过程的一种方式是请求一个 InfoCard。当提供者成功地与请求站点完成身份验证通信后,用户就会认为是处于登录状态,并且可以从他的个人 URL 处获得额外的信息。</p><p> Zend Framework V1.5 不仅支持将 OpenID 和 InfoCard 作为一个客户机站点,还支持将它们作为 OpenID 提供者。这些组件完全分离,互相之间没有依赖性。这看起来很奇怪,通过 Zend Framework V1.5,您可以开发一个不支持 OpenID 的 OpenID 提供者,反之亦然(这更有意义)。框架中还有一个内置的 InfoCard 组件,它为与 OpenID 协同使用的 InfoCards 提供了依赖方(或支持 OpenID)支持。</p><p> Lucene 高级搜索</p><p> Lucene 是一个开源的信息检索搜索引擎,以它的全文本索引能力和搜索互联网能力而著名。Zend_Search_Lucene 组件为把 Zend Framework V1.5 交付了内置的全文本高级搜索引擎功能。需要注意的是,虽然 Lucene 是一个搜索引擎,但它没有爬行能力。您必须手动把全部相关内容添加到 Zend_Search_Lucene 的索引中(参见 参考资料 中关于 Lucene 的 developerWorks 文章)。</p>
<p> </p>
<p> Zend_Search_Lucene 组件并非首先出现在 Zend Framework V1.5 中。这个搜索引擎的早期版本早已实现。可是,Zend Framework V1.5 的发布标志着它从 V1.9 到 V2.2 这一重要升级。通过这一升级, Lucene 组件获得了三种强大的高级搜索选项。</p><p> 现在它已经支持一个或多个通配符,用于范围搜索或模糊搜索。范围搜索在一个指定上下界的范围内查找指定字段的值,而模糊搜索查找与用户提供的术语相似的单词。例如,对 “Mike” 的模糊搜索可能会返回 “bike” 和 “mire”。</p><p> 虽然 Lucene 组件进行了升级,原有的功能仍然存在,并且所有以前存在的索引在增强的 Zend_Search_Lucene 组件第一次用到它们时会自动升级。</p><p> LDAP 授权</p><p> 轻量级目录访问协议(LDAP)在 Zend Framework 中刚刚得到支持。这对于很多开发人员来说是个好消息,比如那些需要创建使用一组现有的正式企业凭证的企业内部网应用程序的开发人员。在 Zend Framework 的文档中需要注意到,当前的支持仅仅是一个最基本的实现,仅仅交付了完成 Zend_Auth_Adapter_LDAP 工作所需的最少功能。</p><p> 您的 config.ini 文件中指定了有关 LDAP 服务器的信息。当用户需要身份验证时,需要提供用户名和密码组合,这些内容和一些附加的 Zend_LDAP 选项将被发送到 .ini 文件指定的 LDAP 服务器上进行身份验证。就像所有其他的授权适配器一样,只要 Zend_Auth_Adapter_Ldap 从服务器中用下列方法得到一个授权后,它就立即返回一个 Zend_Auth_Result :getCode() 将返回发生事件的代码(通过或失败); getIdentity() 将返回进行身份验证尝试的身份;getMessages() 将只包含失败了的身份验证消息;而如果成功通过身份验证则 isValid() 将返回真。</p>
<p> </p>
<p> Nirvanix、Technorati 和 SlideShare Web 服务</p><p> 三种新的 Web 服务组件也成功加入到 Zend Framework V1.5 中:Nirvanix、Technocrati 和 SlideShare。</p><p> Nirvanix 是一个基于互联网的文件存储系统,它允许注册用户通过自己的 API 存储、操作和访问文件。Nirvanix 的设计目的是处理大型的媒体文件(例如视频),并且在能够通过互联网身份验证的任何位置进行访问。</p><p> Technorati 是一个博客(blog)搜索引擎,它的 Web 服务允许您对其数据库进行多种不同的查询,包括常规关键字搜索、标记搜索、top 标记搜索、给定关键字的每日博客总数以及 “cosmos” 搜索(可返回包含特定 URL 链接的结果)。使用 Technorati,您可以快速了解到当天最热门的网络话题并随时保持关注。</p><p> Slideshare.net 是一个为注册用户托管幻灯片的网站。通过 Slideshare 组件,您可以在您的 PHP 应用程序中嵌入由 Slideshare 托管的幻灯片,观看可以共享的幻灯片,还可以为您的 Slideshare 帐户上传新的幻灯片。</p><p> 这三个组件加入到 Zend Framework 目前支持的 Web 服务列表中。不断增加的 Web 服务组件库使您可以快速、轻松地把来自多个流行网站的内容集成到一个 PHP 应用程序中。这些 Web 服务组件可以单独安装,无需安装其他的 Zend Framework 组件,这种特性非常受欢迎,适合于 PHP 开发新手以及经验丰富、喜欢使用不同框架工作的 PHP 开发人员。</p><p> 接下来,我们将查看一些特性增强,这种增强是对现有特性和组件的重大更新,现有组件和特性需要进行修改,从而满足不断变化的互联网领域的需求。</p><p> Google GData</p><p> Zend_GData 组件本质上是面向支持 GData API 的各种 Google 服务的大型适配器。可被 Zend_GData 组件访问的更新后的 GData 服务列表包括:</p>
<p> </p>
<p> Google Base </p><p> Google Blogger </p><p> Google Calendar </p><p> Google Codesearch </p><p> Google Documents List </p><p> Google Notebook </p><p> Google Provisioning </p><p> Google Spreadsheets </p><p> Picasa Web Albums </p><p> YouTube </p><p> 也许在 Zend Framework V1.5 中人们最期待的新的 Web 服务支持是对 YouTube API 的支持。现在,通过使用 Zend_GData,您可以使用很多匹配条件搜索并访问 YouTube 视频、访问视频提要和订阅、查看用户个人信息,查看一个特定用户的全部视频和最受欢迎的视频并获取评论。通过现有的功能,可以找到适当的 YouTube 内容并把它们无缝集成到您的 PHP 应用程序中。</p><p> 目前,Zend Framework 的 YouTube API 支持是只读的。</p><p> 对 Ajax 支持的改进: ContextSwitch helper 和 REST</p><p> Asynchronous JavaScript + XML (Ajax) 对将信息传送到客户机的浏览器会话的方式产生了深远影响。非常简单:使用 Ajax 客户端 JavaScript 可以请求并接收来自外部信息源的信息,无需离开主窗口位置导航或重新装载。Ajax 大量应用于 Web 应用程序中,如 Gmail,后者在更新信息时保持基础窗口不变,且无需重新装载整个窗口。</p><p> Zend Framework V1.5 已经通过 ContextSwitch helper 和 Zend_REST 组件改进了原生 Ajax 支持。</p><p> ContextSwitch helper 是 Zend_Controller 的一部分,用于以不同的格式或上下文传送现有内容。例如,假设您已经创建了一个用于创建页面的控制器,它列出您在过去三周内吃过的全部早餐的详细信息。通常,这将通过含有布局和视图(与浏览器友好的网站的其余内容保持一致)的页面显示。现在假设某个人问您是否能以 XML 的形式提供同样的列表。使用 ContextSwitch,您不需要再创建单独的控制器。只需告诉 helper 它可以显示 XML 并且创建 XML 视图脚本,而不是普通的上下文视图脚本。它将确保文档扩展和标题恰当且形式良好,并且以 Ajax 友好的 XML 形式显示您的全部早餐。</p></p><p> 现在,事情甚至更加简单了:在 Zend Framework V1.5 中有一个 AjaxContext helper,它专门用来将上下文切换到 XML,从而构建 Ajax 响应。</p><p> 对 Ajax 的支持继续扩展到 Zend_REST 组件,它包含 REST 客户机和全部的 REST 服务器功能。Zend_REST 可用于生成您自己的 Web 服务或访问和解析 Web 服务。当然,您发布的 XML Web 服务可通过 Ajax 轻松地进行访问。</p><p> 结束语</p><p> 我们已经了解到,Zend Framework V1.5 实现了很多令人兴奋的进展。某些更新可以简化一些日常任务的正确设置,而其他更新则使选项更容易访问。全部这些更新都为您提供了更加强大的功能,这永远不会是坏事。</p></p>