THE MOMENT, THE MEMENTO

2009年08月24日

干扰Zend_Layout的resources.view.encoding

标签:, , — 吴德文 @ 13:07

前情提要:最近开始好好的学习Zend Framework(zf)。其实以前也学了一阵子zf(再之前学的就是FleaPHP了),那还是1.5版本的时候,可惜忙着其它事情,就没有学下去,一个项目也就扔了一个半成品在那里。暑假开始做一个单位的项目,就重新把zf捡了起来,当然现在用的是1.8.4了(虽然zf版本已经到了1.9.1,可是zend-ce用的还是1.8.4,它什么时候才更新呢?)。

项目是还一边学着一边做的,同时看着的有快速入门(也是Zend Studio上的example项目),参考手册入门教程(从1.5.2到1.6.3),以及www.phpchina.com上多模块应用程序的相关文章(如:用Zend_Application实现多模块(modules)及多模板(templates)应用程序)。本来是希望多学些东西,然后直接写出理想的程序雏形,可惜这些从简单到复杂的教程内容混杂在一起,自己的代码也就不在纯洁了,开始互相干扰了。

经过几天的努力建立了简单的MVC雏形,主要是写了一个统一通用的EntityManager(我的目标是能像Java的EJB 3.0一样管理Entity,只是不明白Zend为什么没有提供这样的结构)花了比较长的时间。

Layout是参考着入门教程来写的,当写完Bootstrap的_initViewHelpers()时,我想为什么不把view的一些设定放在application.ini中去呢?于是便参考了phpchina.com上面的文章设置了resources.view.*的内容,其中包括resources.view.encoding=”UTF-8″。

这样问题就来了。

开始往layout.phtml中写入$this->baseUrl()时,发现系统不能正常显示:

Fatal error: Uncaught exception ‘Zend_Loader_PluginLoader_Exception’ with message ‘Plugin by name ‘BaseUrl’ was not found in the registry; used paths: Zend_View_Helper_: Zend/View/Helper/:./views/helpers/’

虽然路径是对的但是就是找不到BaseUrl助手;与此同时,在Controller中设定的title变量也不显示。然后,这两个内容在views/scripts/index.phtml中是可以正常显示的。

开始以为是入门教程有问题,认为可能是Layout和View的调用顺序不一样,有些东西在layout中没有初始化。于是到处查Layout和View的差别,甚至试图在layout和view script中分别把$this变量打印出来比较差别,最终还是徒劳,还在想是不是该好好将参考手册乃至于API精读一下。

今天下午,不知怎的,突然开窍了。心想,既然人家的入门教程写了这么多人看都没有问题,那么上面的东西应该是对的,为什么不放弃自己项目中杂七杂八的想法,老老实实的遵循教程中简单的思路试试看行不行呢?

于是重新新建一个项目,遵照入门教程的步骤一步步进行(当然由于是测试layout,数据库以及Model就没有建立了),发现这样就不存在之前的问题。这说明问题是我自己项目中混乱的代码引起的,就开始排查。

最后,发现问题就出在resources.view.encoding=”UTF-8″这句话上面,即便是我将值改成默认的ISO-8859-1,错误依旧。解决办法就是将这句话去掉。

至于为什么这句话会引起这么大的问题,暂时先不管了,以后深入使用View的时候应该就会了解了吧。

思考:

这次错误虽然只是短短的一句话,但是却让项目陷入了停顿状态,让我近一个礼拜都心神不宁。写下这篇文章目的一个是让其它人遇到相同问题的时候,能搜到解决方案;此外,也在此审视一下自己的一些态度方法。

首先,是自己贪快、贪多。一开始就没有好好遵照某一个教程完成一个项目,很多方法只是看了文章还没有实践,就想着开始改进它。教程看到一半,就想依照心中实际项目的需要,又从其它教程中拉入自己还不是很熟悉的内容进来,最终让代码失去了控制。就好像,一种内功连到一半还不熟练,就想把另一种不熟练的内功融合进来,这样轻则神志大乱,重则吐血而亡。这个似乎是我性格中的毛病,在很多方面都有类似的例子,以后一定要切记、切记呀。

其次,当发生错误的时候,始终在自己的思路中钻牛角尖。老是想在一团混乱中找到一丝线索,乃至于把简单的事情复杂化,要去追寻事物的原理。事实上,这样一个简单的东西,人家教程里的东西就已经是一种经验(模式),不会错的,就是大家该遵循的。如果我及早放弃自己的思路,老老实实按照人家经验的做法,问题就能提早解决。其实我也经常说别人不肯放弃自己的思路而遵循别人的思路去解决问题,只是没想到自己也犯了这样的毛病,以后切记、切记呀。


Related:

Valid XHTML 1.1 Valid CSS! Creative Commons License WordPress 所驱动