开放的编程资料库

当前位置:我爱分享网 > PHP教程 > 正文

Zend Framework 中的 MVC 更改

几个月前,Andi让我担任首席开发人员,负责重构ZendFrameworkMVC组件。我同意了,尽管有些不情愿。我已经维护了另一个MVC库,但不确定我能否很好地填补像我的朋友Mike和Paul那样的人的空缺,Mike完成了控制器类的初始开发,而Paul提供了Zend_View.

然而,这段经历非常有益,我有机会在此过程中征求一些顶尖开发人员的意见并与他们一起工作。在接下来的一周左右,我们将发布框架的0.6.0版,它将包括我在MVC组件中的大部分工作,作为核心分发的一部分。非常感谢所有提供意见、设计帮助、代码、测试和文档的人;再次感谢Andi对我的信任和支持。

那么,有哪些变化呢?继续阅读以找出……

此时大部分更改都在幕后;MVC组件的最基本用法保持不变。引入的更改主要促进更大的灵活性和测试。事实上,最重要的变化,即请求和响应对象的引入,对大多数用户来说是透明的,但正是这些变化使MVC组件的单元测试变得可能和容易。

因此,正如您可能已经猜到的那样,控制器类现在已经过单元测试;覆盖率并不完美,但它是合理的(目前大约68%的代码覆盖率),并且比之前基本为零的覆盖率有所改进(只有Martel的RewriteRouter在我开始之前进行了测试)。这对开发人员意味着,从现在开始,对控制器类的任何更改都需要通过回归测试……而这些测试确实存在。这也意味着现在可以在不需要Web服务器的情况下对应用程序进行单元测试;这将是基于该框架的MVC应用程序迈出的一大步。

通过引入请求和响应对象,我们现在不再需要依赖网络环境来发出请求;拥有一个响应对象使得捕获来自各种动作控制器的输出然后针对预期结果进行测试变得微不足道。这是一个巨大的变化。

此外,通过将控制器与请求环境分离,可以在非Web环境中使用MVC组件。想想CLI和PHP-GTK。

另一个变化是不再需要路由器。这允许开发人员在实际上可能不需要路由的非Web环境中使用MVC组件,以及在难以配置漂亮URL的Web环境中使用MVC组件。例如,IIS没有开箱即用的mod_rewrite等价物,因此能够指定一个url,例如http://localhost/index.php?controller=index&action=view并正确调度它是一个不错的功能。

许多人要求的一个功能是能够将参数推送到前端控制器,并将这些参数推送到每个路由器、调度程序和动作控制器。这种能力将消除对注册表的需求,并且还允许整个控制器链共享一个环境。今天,当请求能够在请求URI中指定可选模块参数时,我使用了它;我没有破坏向后兼容性或创建新的路由器和调度程序,而是能够简单地通过链推送useModules设置,如果发现,则对其进行操作。(此新功能允许诸如http://localhost/module/controller/action之类的url分派到Module_Controller::actionAction();想想子目录中的控制器类。)

我认为很多人不了解的一个功能是Response对象。它是请求生成的整个响应的容器,无论是来自单个操作还是多个操作。因此,它还会聚合流程中的异常。它的最终目的是将该响应返回给客户端,这通过简单的echo()来完成;它的__toString()方法应该负责执行任何最终渲染。

新系统提供的基本响应对象做的很少。它允许通过其setBody()appendBody()方法设置和聚合内容,以及通过setHeader()设置标题.如果发生异常,它们将通过setException()注册。文档中的建议是使用appendBody()来聚合内容,然后让__toString()通过回显末尾的响应来整体返回聚合的内容调度循环:echo$front->dispatch().

虽然这很好,但您可以用它做一些更有趣的事情。在我最近做的一个项目中,我在响应对象中集成了Zend_ViewZend_Json,并在我的动作控制器中添加了访问器以将内容推送到响应对象。然后,根据请求,我可以在返回JSON字符串或XHTML内容之间切换。如果发生异常,我可以重定向到错误页面,或者在AJAX请求的情况下,返回封装在JSON字符串中的错误。这种上下文切换非常强大,稍后我将在博客中详细介绍如何实现。

如果您已经使用了框架MVC但还没有尝试过新代码,我鼓励您下载一个快照或从subversion中抓取它并试一试;有一份涉及迁移的文档,对此的任何反馈或补充将不胜感激(框架wiki中的该文档当前已过时;查看您下载的框架发行版中的文档以获取更多最新信息)。

如果您还没有尝试过MVC框架,并且对MVC库感兴趣,请尝试一下,让我知道您的想法!

未经允许不得转载:我爱分享网 » Zend Framework 中的 MVC 更改

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏