zend framework多模块多布局配置


Posted in PHP onFebruary 26, 2011

许多人在使用过程中都会遇到这样那样的问题,而且zend framework现在已经到1.11版本了,网络上的很多资料都还停留在旧版本上,因此我在这里以当前的最新版本1.11为例,来简单介绍一下如何使用zend framework创建模块化的应用程序。由于今后框架的版本升级,有些内容可能会过时,请及时参阅最新的使用手册。

1、准备工作

首先假设你已经部署了web服务器和php,并下载了zend framework的最新版本,创建了一个最原始的zend framework项目,并可以访问默认的action了。你可以使用zend framework工具来创建项目,具体操作参见使用zend framework创建项目。当然也可以自己手动建立文件夹和文件,参见zend framework推荐的项目目录结构。

简单地看一下默认的几个重要目录。
首先是public,它不但存放了程序的入口点index.php,还可以存放图片,css,javascript文件等。
其次是library,用于存放一些类库,包括你自己定义的或第三方的类库。
然后是test,用于存放单元测试等测试文件的。
最后,也是和我们这里要讲的关系最大的目录——application。进到application目录下,会有以下目录:
configs:存放配置文件,一般会有一个主配置文件application.ini;
controllers:操制器,如默认的IndexController.php;
models:存放业务逻辑,数据模型等文件;
views:视图层的脚本,一般以.phtml为后缀名;
modules:模块目录,使用工具默认选项自动生成的是没有这个目录的,需要手动添加。modules底下可以包含多个以模块名命名的文件夹,如admin,默认是default,一个文件夹代表一个模块,其下的目录结构与application目录类似,又可以包含controllers,models,views等目录。需要注意的是模块下的controllers下面的文件的类名请加上模块名前缀,如application/modules/admin/controllers/IndexController.php的类名为Admin_IndexController。

如果你需要在项目中方便的使用你自己写的一些类库(如名称空间是Rockux),或是第三方的类库,可以修改application.ini文件,添加以下行:

autoloaderNamespaces.rockux = "Rockux_" 
autoloaderNamespaces.thirdParty = "ThirdPartyLibrary_"

当然你也可以根据需要多添加几个,不过请注意最后面的下划线。

2、建立模块
现在我们来创建一个admin模块,目录如下:
application/modules/admin/controllers
application/modules/admin/models
application/modules/admin/views
application/modules/admin/views/scripts
application/modules/admin/views/helpers
application/modules/admin/views/filters
并创建以下文件:
application/modules/admin/controllers/IndexController.php(类名为Admin_IndexController)
application/modules/admin/views/scripts/index/index.phtml

除了新建模块文件之外,还需要更改配置文件application.ini,删除以下行,如果有的话:

resources.frontController.controllerDirectory = APPLICATION_PATH"/controllers"

再加上如下行:
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules" 
resources.frontController.moduleControllerDirectoryName = "controllers" 
resources.frontController.defaultModule = "default" 
resources.modules[]

这样,再访问http://localhost/admin,应该就能看到admin模块输出的内容了。
如果我们要充分发挥模块的强大功能,我们还需要为模块添加一个启动文件——Bootstrap.php。它可以使得你在事个模块中方便的使用类资源,models, filters, helpers等。在admin下新建Bootstrap.php,代码如下:
class Admin_Bootstrap extends Zend_Application_Module_Bootstrap 
{ 
}

并且在application/Bootstrap.php文件里加入以下方法:
protected function _initAppAutoload() 
{ 
$autoloader = new Zend_Application_Module_Autoloader(array( 
'namespace' => 'App', 
'basePath' => dirname(__FILE__), 
)); 
return $autoloader; 
}

resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts" 
resources.layout.layout = "layout" 
admin.resources.layout.layout = "admin"

第二种,不同模块的布局脚本文件分别存放在各自的模块文件夹下
可以在application下新建如下目录和文件:
application/layouts/scripts/layout.phtml
application/modules/admin/layouts/scripts/layout.phtml

在配置文件application.ini中添加如下几行:

resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts" 
resources.layout.layout = "layout" 
admin.resources.layout.layoutPath = APPLICATION_PATH "/modules/admin/layouts/scripts"

不论是第一种还是第二种,这时如果访问http://localhost/admin,你会发现系统并没有使用期望的admin.phtml作为布局文件,而是使用了默认的layout.phtml。这是因为admin那行配置并不是系统默认能处理的有效配置,所以我们要自己来处理它。

我们新建文件:library/Rockux/Controller/Action/Helper/LayoutLoader.php,

针对第一种情况代码如下:

class Rockux_Controller_Action_Helper_LayoutLoader extends Zend_Controller_Action_Helper_Abstract 
{ public function preDispatch() 
{ 
$bootstrap = $this->getActionController() 
->getInvokeArg('bootstrap'); 
$config = $bootstrap->getOptions(); 
$module = $this->getRequest()->getModuleName(); 
if (isset($config[$module]['resources']['layout']['layout'])) { 
$layoutScript = $config[$module]['resources']['layout']['layout']; 
$this->getActionController() 
->getHelper('layout') 
->setLayout($layoutScript); 
} 
} 
}

针对第二种情况代码如下:
class Rockux_Controller_Action_Helper_LayoutLoader extends Zend_Controller_Action_Helper_Abstract 
{ public function preDispatch() 
{ 
$bootstrap = $this->getActionController() 
->getInvokeArg('bootstrap'); 
$config = $bootstrap->getOptions(); 
$module = $this->getRequest()->getModuleName(); 
if (isset($config[$module]['resources']['layout']['layoutPath'])) { 
$layoutPath = 
$config[$module]['resources']['layout']['layoutPath']; 
$this->getActionController() 
->getHelper('layout') 
->setLayoutPath($layoutPath); 
} 
} 
}

接下来我们还需要将它添加到application/Bootstrap.php里去
protected function _initLayoutHelper() 
{ 
$this->bootstrap('frontController'); 
$layout = Zend_Controller_Action_HelperBroker::addHelper( 
new Rockux_Controller_Action_Helper_LayoutLoader()); 
}

再次访问http://localhost/admin,应当就可以看到使用指定的布局文件了。
如果要针对某个特定的controller使用特定的layout,可以在controller的init()方法里添加如下代码:
$layout = Zend_Layout::getMvcInstance(); 
$layout->setLayout('layout_special');
PHP 相关文章推荐
基于mysql的论坛(2)
Oct 09 PHP
php防攻击代码升级版
Dec 29 PHP
php中强制下载文件的代码(解决了IE下中文文件名乱码问题)
May 09 PHP
Php中文件下载功能实现超详细流程分析
Jun 13 PHP
php 表单提交大量数据发生丢失的解决方法
Mar 03 PHP
thinkphp中ajax与php响应过程详解
Dec 08 PHP
PHP安全上传图片的方法
Mar 21 PHP
php在apache环境下实现gzip配置方法
Apr 02 PHP
PHP判断用户是否已经登录(跳转到不同页面或者执行不同动作)
Sep 22 PHP
PHP文件与目录操作示例
Dec 24 PHP
PHP+redis实现的悲观锁机制示例
Jun 12 PHP
Thinkphp5框架实现获取数据库数据到视图的方法
Aug 14 PHP
让你成为更出色的PHP开发者的10个技巧
Feb 25 #PHP
理解php Hash函数,增强密码安全
Feb 25 #PHP
php中根据某年第几天计算出日期年月日的代码
Feb 24 #PHP
PHP中防止SQL注入实现代码
Feb 19 #PHP
简单的移动设备检测PHP脚本代码
Feb 19 #PHP
PHP下通过file_get_contents的代理使用方法
Feb 16 #PHP
php文件上传表单摘自drupal的代码
Feb 15 #PHP
You might like
一周学会PHP(视频)Http下载
2006/12/12 PHP
PHP关联链接常用代码
2012/11/05 PHP
php中使用PHPExcel读写excel(xls)文件的方法
2014/09/15 PHP
Swoole-1.7.22 版本已发布,修复PHP7相关问题
2015/12/31 PHP
php 人员权限管理(RBAC)实例(推荐)
2017/05/24 PHP
laravel 使用事件系统统计浏览量的实现
2019/10/16 PHP
使用CSS3的scale实现网页整体缩放
2014/03/18 Javascript
Web开发必知Javascript技巧大全
2016/02/23 Javascript
微信小程序 Record API详解及实例代码
2016/09/30 Javascript
AngularJS使用ng-inlude指令加载页面失败的原因与解决方法
2017/01/19 Javascript
基于Vue渲染与插件的加载顺序的问题详解
2018/03/05 Javascript
详解js根据百度地图提供经纬度计算两点距离
2019/05/13 Javascript
深入了解js原型模式
2019/05/30 Javascript
javascript实现贪吃蛇小游戏
2020/07/28 Javascript
手把手教你如何编译打包video.js
2020/12/09 Javascript
[42:52]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python 从远程服务器下载日志文件的程序
2013/02/10 Python
Python设计模式中单例模式的实现及在Tornado中的应用
2016/03/02 Python
Python的“二维”字典 (two-dimension dictionary)定义与实现方法
2016/04/27 Python
使用Python实现微信提醒备忘录功能
2018/12/04 Python
Python 互换字典的键值对实例
2019/02/12 Python
详解python爬虫系列之初识爬虫
2019/04/06 Python
opencv3/C++图像像素操作详解
2019/12/10 Python
Win系统PyQt5安装和使用教程
2019/12/25 Python
Smashbox英国官网:美国知名彩妆品牌
2017/11/13 全球购物
澳大利亚在线高跟鞋商店:Shoe Me
2019/11/19 全球购物
Electric官网:美国高级眼镜和配件品牌
2020/06/04 全球购物
介绍下Lucene建立索引的过程
2016/03/02 面试题
硕士研究生自我鉴定
2013/11/08 职场文书
资料员的岗位职责
2013/11/20 职场文书
金融专业大学生自我评价
2014/01/09 职场文书
“四风”查摆问题自我剖析材料
2014/09/27 职场文书
教师批评与自我批评总结
2014/10/16 职场文书
Nginx配置80端口访问8080及项目名地址方法解析
2021/03/31 Servers
Python max函数中key的用法及原理解析
2021/06/26 Python
CSS 实现角标效果的完整代码
2022/06/28 HTML / CSS