辛勤的鸟儿总能找到虫子....
分类: 系统运维
2010-08-18 13:57:08
在该书最开始的第二章里,作者对 Zend Framework 的配置作了相当灵活的介绍与实现,以致于很多朋友都无法搞懂。所以只要徘徊在大师的教室之外,包括我在内。幸运的是,经过昨天晚上第 N+1 次的尝试,我终于艰难地走出了《PHP Web 2.0 开发实战》的第二章,终于把第二章的基本配置解决了,终于可以开始真正学习这本经典之作了。为了帮助其它跟我一样深感迷惑的朋友,我在下面会分享我的经历。只要你能认真看完这篇文章,相信你一定会走出第二章的阴霾。
首先说明,我的配置跟书中的一些配置还是有一些不同的,比如,书中的 Controllers 目录在 include 目录下,而我的则在 application 下,当然这些都不会影响正常的实现。
来看我的目录结构:
注:zfw/application/Smarty 为 Smarty 模板目录;zfw/templates 为 Smarty 模板文件目录。
我把整个第二章分为两个部分,即基本配置(不含 Smarty)和将 Smarty 模板集成到网站,根据书中的内容,这两部分分别是 2.9 节以前(不含)和 2.9 节以后。
第一部分
在你配置好跟上面相同的目录树以后,就可以开始我们本次的配置了。(相信你已经完成 WAMP 平台的搭建了吧)
第一步:在 Zfw 目录下建立三个文件:.htaccess、index.php、settings.ini。.htaccess 的内容直接按书的内容写:
RewriteEngine on
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1
settings.ini 也是如此,不过在目录设定上要根据自身配置,内容如下:
[development]
database.type =pdo_mysql
database.hostname =localhost
database.username =root
database.password =demopin
database.database =phpweb20
paths.base =/
paths.data =data
paths.templates =templates
log.file =logs/debug.log
重点来看 index.php 的内容:
error_reporting(E_ALL);
set_include_path(get_include_path().";"
.dirname(__FILE__)."\application;"
.dirname(__FILE__)."\library");
require_once('Zend/Loader.php');
Zend_Loader::registerAutoload();
//创建 Front 并显示
$front=Zend_Controller_Front::getInstance();
$front->throwExceptions(true);
$front->setControllerDirectory('application/controllers');
$front->dispatch();
这里需要说明几点:
1. set_include_path 中把当前目录(zfw)、application 子目录以及 library 子目录(事实上,这个目录最为重要,因为它包括了 Zend 框架)包括了进来。
2. 最开始的 error_reporting(E_ALL),你可以随时把它注释掉,这里加上它的目的是为了检查错误。即当你发现网页显示不正常时,就去掉它前面的注释,分析错误信息并解决。
第二步,创建控制器
在 application\controllers 下建立 IndexController.php 文件,内容如下:
class IndexController extends Zend_Controller_Action{
public function indexAction(){
$this->view->name="NBWD";
}
}
?>
在 application\views\scripts\index 下建立 index.phtml 文件,内容如下:
Hello, you are name; ?>.
现在,打开网站,如果你已看到:Hello, you are NBWD. 恭喜你,初战告捷。
第三步,扩展控制器
大师不愧是大师,在接下来的这一点上就足可以证明了。扩展控制器正如书上的引导:建立一个 CustomControllerAction 控制器,继承自 Zend Framework 的标准控制器 Zend_Controller_Action ,之后站点的 IndexController 再继承自那个自定义的控制器。
CustomControllerAction.php(位于 zfw\application\controllers)的 代码按照书中录入即可。上面的 IndexController.php 的内容变动如下:
require_once "CustomControllerAction.php"; //将自定义控制器包括进来
class IndexController extends CustomControllerAction{
public function indexAction(){
$this->view->name="NBWD";
}
}
?>
这时,如果再打开网站,会出现异常,根据异常信息可以明显知道,这是由于在 CustomControllerAction 使用了未注册过的 db ,在下面一步中,我们使用 Zend_Registry 组件来完成这个注册。
第四步,定义应用配置和连接数据库(书中 2.7 节和 2.8 节)
关于 settings.ini 的内容以及它的位置,在第一步中已经讲明。将zfw/index.php 文件内容更新如下:
//error_reporting(E_ALL);
set_include_path(get_include_path().";"
.dirname(__FILE__)."\application;"
.dirname(__FILE__)."\library");
require_once('Zend/Loader.php');
Zend_Loader::registerAutoload();
//配置
$config=new Zend_Config_Ini('settings.ini','development');
Zend_Registry::set('config',$config);
//数据库
$params=array('host'=>$config->database->hostname,
'username'=>$config->database->username,
'password'=>$config->database->password,
'dbname'=>$config->database->database
);
$db=Zend_Db::factory($config->database->type,$params);
Zend_Registry::set('db',$db);
//创建 Front 并显示
$front=Zend_Controller_Front::getInstance();
$front->throwExceptions(true);
$front->setControllerDirectory('application/controllers');
$front->dispatch();
?>
这时,再刷新站点主面,正常显示跟原先一样。
完成到这一步时,第一部分的任务已经顺利完成,因为我们马上要进入第二部分——集成 Smarty和日志功能,这又是一个新的挑战,Let's GO!
第二部分
第一步,模板类的创建
如前面的目录树一样,将下载下来的 Smarty 放到 zfw/application 下面。接下来开始 Templater.php 的编写。先说明一下,书中曾提到该文件要与 Zend 框架的类命名结构相一致,这意味着必须将这个类存放在 ./include 目录中。而在本例中,经过我的测试,该文件放到 zfw/application 或 zfw/library 下面都可以(这是因为 set_include_path 的原因),建议你将它放到 zfw/library 目录下。
Templater.php 的文件内容,按照书中的内容录入即可。
第二步,集成 Smarty
在 index.php 中 Zend_Registry::set('db',$db); 一句后加入如下代码:
//集成 Smarty
$vr=new Zend_Controller_Action_Helper_ViewRenderer();
$vr->setView(new Templater());
$vr->setViewSuffix('tpl');
Zend_Controller_Action_HelperBroker::addHelper($vr);
第三步,建立 Smarty 模板文件
在 zfw/templates/index 目录下建立 index.tpl 文件。文件内容无所谓:Hello, world ,即可。或者像书中一样建立完整的 HTML 文档。
这时,刷新站点页面,将会显示这个模板的内容,如果你看到了 Hello, world,再次恭喜你,集成 Smarty 成功。
第四步,增加日志功能
在 index.php 中加上如下代码:
//日志
$logger=new Zend_Log(new Zend_Log_Writer_Stream($config->log->file));
Zend_Registry::set('logger',$logger);
$logger->debug('TEST');
然后,在 zfw/logs 下面建立 debug.log 文件。这时,再次刷新网页,来查看 debug.log 文件,已经增加一条日志信息,OK,顺利加入日志功能。
到了这里,终于把第二章的配置完成了,相信这是一个不小的成功。所谓“一夫当关,万夫莫开”,第二章就好比那“一夫”,如今你已经把第二章顺利拿下,那么接下来的学习就应该顺利了。如果有哪位朋友对上面的步骤有不懂的地方,可以留言。另外,我本人目前也在学习这本书,如果愿意交流,请留下你的联系方式,欢迎交流,共同进步。
如果您对本文中介绍的方法有何意见或建议,请留下您的高见,欢迎交流。本文由 NBWD 原创,请放心转载。
附: 《PHP Web 2.0 开发实战》原书封面