zend framework多模块多Layout配置
转自: http://blog.csdn.net/a82168506/article/details/10228011
上次接触zend framework已经很久远了,10年的事情了。最近在做一个项目,时间不紧,就又把ZF拿出来折腾。而我发现以前做ZF的记忆已经在我脑中如梦幻泡影,消失无踪,为了配置多模块还又去查了资料,为了避免此种情况再次发生,做个记录吧。
首先,我们要新建一个ZF项目,目录结构如下。
我们想要配置多模块呢,首先要在,application下面建一个modules文件夹,然后创建模块文件夹,这里我以default和admin举 例。default为前台,admin为后台,符合最基础的网站所需了。在modules下面新建default以及admin文件夹,然后分别把 controllers,models以及views剪切到这两个文件夹内。此时,文件目录如下所示。并且将Bootstrap.php文件分别复制到两 个目录里。
首先,我们去修改application.ini文件。删除以下这行。
- resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
然后添加以下内容。
- resources.frontController.controllerDirectory.default =APPLICATION_PATH "/modules/default/controllers"
- resources.frontController.controllerDirectory.admin =APPLICATION_PATH "/modules/admin/controllers"
- resources.FrontController.moduleDirectory =APPLICATION_PATH "/modules"
- resources.FrontController.moduleControllerDirectoryName ="controllers"
- resources.FrontController.defaultModule= "default"
- resources.modules[] = ""
这里我们看到,我们设置了default模块为默认模块。也就是说default模块里面的controller和model的类名都不需要另外处理,而其它模块里面的controller及model的类名都需要加模块前缀哦,这里后面会详细讲到。
然后我们去修改application/Bootstrap.php文件为以下内容。
- <?php
- class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
- {
- protected function _initAppAutoload() {
- $autoloader = new Zend_Application_Module_Autoloader(array(
- 'namespace' => 'App',
- 'basePath' => dirname(__FILE__),
- ));
- return $autoloader;
- }
- }
到这里还没有结束,我们需要去修改对应的模块里面的Bootstrap.php文件的内容。
先修改application/modules/default/Bootstrap.php,修改为以下内容:
- <?php
- class Default_Bootstrap extends Zend_Application_Module_Bootstrap {
- protected function _initAutoload() {
- $autoloader = new Zend_Application_Module_Autoloader(array(
- 'namespace' => '',
- 'basePath' => APPLICATION_PATH . '/modules/default'));
- return $autoloader;
- }
- }
然后再修改为 application/modules/admin/Bootstrap.php,修改为以下内容:
- <?php
- class Admin_Bootstrap extends Zend_Application_Module_Bootstrap {
- protected function _initAutoload() {
- $autoloader = new Zend_Application_Module_Autoloader(array(
- 'namespace' => '',
- 'basePath' => APPLICATION_PATH . '/modules/admin'));
- return $autoloader;
- }
- }
以上的修改要注意两点,第一,注意类名需要加模块前缀,第二,注意模块里面的文件名继承的是 Zend_Application_Module_Bootstrap而不是 Zend_Application_Bootstrap_Bootstrap。如果继承文件错误的话,会报错:Maximum function nesting level of '100' reached, aborting!
我们再进行最后一步,就可以进行多模块的访问了。因为default是默认模块,所以我们不需要去修改,我们要去修改的是admin模块里面的内容。
打开admin模块里面的IndexController.php文件,修改类名为:
- class Admin_IndexController extends Zend_Controller_Action
- {
- }
此时我们可以测试一下,我们访问http://localhost/project/public则访问的是default模块的首页,当访问http://localhost/project/public/admin时访问的是后台首页。
我们说完了多模块配置的contoller访问之后,再来提一下model的访问。
首先我们去修改配置文件,application.ini。在production中添加如下内容。
- db.adapter = PDO_MYSQL
- db.params.host = localhost
- db.params.dbname = voice_sms
- db.params.username = root
- db.params.password = 123456
- db.params.charset = UTF8
然后我们去连接数据库,在application/Bootstrap.php里面添加这个方法
- protected function _initDatabase() {
- $options = $this->getApplication()->getOptions();
- $db = Zend_Db::factory( $options[ 'db' ][ 'adapter' ], $options[ 'db' ][ 'params' ] );
- Zend_Db_Table_Abstract::setDefaultAdapter( $db );
- Zend_Registry::set( 'DB', $db );
- return $db;
- }
先说default模块。
在application/default/models里面添加一个model文件,SmsInformation.php,此文件的内容为:
- class Model_SmsInformation
- {
- private $_tableName;
- private $_connect;
- /**
- * construct function
- */
- public function __construct() {
- $this->_tableName = 'smsinformation';
- $this->_connect= Zend_Registry::get( 'DB' );
- }
- }
我们在在application/default/controller/IndexController.php中用以下语句则可实例化此model
- $smsInformationModel = new Model_SmsInformation();
然后说admin模块。
在application/admin/models里面添加一个model文件,SmsInformation.php,此文件的内容为:
- class Admin_Model_SmsInformation
- {
- private $_tableName;
- private $_connect;
- /**
- * construct function
- */
- public function __construct() {
- $this->_tableName = 'smsinformation';
- $this->_connect= Zend_Registry::get( 'DB' );
- }
- }
请注意,类名有模块前缀哦。
我们在在application/admin/controller/IndexController.php中用以下语句则可实例化此model
- $smsInformationModel = new Admin_Model_SmsInformation();
最后还有layout配置,在两个模块下面分别新建layouts/scripts文件夹,里面放入默认布局文件layout.phtml。
目录结构如下:
layout.phtml的文件内容为:
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <?php $baseUrl = $this->baseUrl();?>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <?php
- echo $this->headTitle();
- $this->headLink()->appendStylesheet($baseUrl . "/css/admin.css");
- echo $this->headLink();
- $this->headScript()->appendFile($baseUrl . "/js/jquery-2.0.2.min.js");
- echo $this->headScript();
- ?>
- </head>
- <body>
- <div class="container">
- <?php echo $this->layout()->content; ?>
- </div>
- </body>
- </html>
将application.ini中加入两句话:
- default.resources.layout.layoutPath = APPLICATION_PATH "/modules/default/layouts/scripts/"
- admin.resources.layout.layoutPath = APPLICATION_PATH "/modules/admin/layouts/scripts/"
然后去修改application/Bootstrap.php文件。
在Bootstrap类中添加一个方法
- /**
- * about multi-layout configuration
- */
- protected function _initLayoutHelper()
- {
- $this->bootstrap('frontController');
- $layout= Zend_Controller_Action_HelperBroker::addHelper(
- new Rockux_Controller_Action_Helper_LayoutLoader());
- }
在此文件中再添加一个类
- /**
- * Layout
- *
- * @package Applicaiton
- * @author Qiao Chen <cq279286727@sina.com>
- * @version $$Id: Bootstrap.php 2013-9-22
- */
- 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);
- }
- }
- }
对应的模块会去找到对应的layout。
再说几个layout的常见用法。
如果不使用layout,可用以下语句。
- $this->_helper->layout()->disableLayout();
如果使用此模块中其它layout,可用以下语句。
- $this->_helper->layout()->setLayout("loginlayout");
到这里就一切OK了。
zend framework多模块多Layout配置的更多相关文章
- zend framework多模块配置
上次接触zend framework已经很久远了,10年的事情了.最近在做一个项目,时间不紧,就又把ZF拿出来折腾.而我发现以前做ZF的记忆已经在我脑中如梦幻泡影,消失无踪,为了配置多模块还又去查了资 ...
- Zend Framework(一) windows8.1下配置zend framework1.12
windows8.1下配置zend framework1.12配置步骤: 1. 下载 zend framework1.12库 2. 创建zend frameworkproject 2 ...
- zend framework 1.10项目配置与经典hello world
准备工作 前置条件:PHP>=5.14,Apache开启mod_rewrite支持,开启php的pdo扩展. Zend Framework 要求 PHP版本不低于5.1.4,但强烈建议使用 5. ...
- Zend Framework Module之多模块配置
摘要:该文将为大家简单介绍一下如何使用zend framework创建模块化的应用程序. zend framework对多模块的支持是很好的,但是可能是由于功能太过强大的缘故,部署起来并不是很容易.许 ...
- 主流PHP框架间的比较(Zend Framework,CakePHP,CodeIgniter,Symfony,ThinkPHP,FleaPHP)
Zend Framework 优点: Zend Framework大量应用了PHP5中面向对象的新特征:接口.异常.抽象类.SPL等等.这些东西的应用让Zend Framework具有高度的模块化和灵 ...
- Zend Framework 1 - Quick Start
创建 Zend 项目 要创建 Zend 项目,首先要下载并解压 Zend Framework. 安装 Zend Framework 下载最新的 Zend Framework 1.12.20 源码包,( ...
- Zend Framework 入门(4)—页面布局
Zend Framework 的页面布局模块——Zend_Layout——既可以跟 MVC 一起使用,也可以单独使用.本文只讨论与 MVC 一起使用的情况. 1. 布局脚本 在 application ...
- Zend Framework 入门(1)—快速上手
1. 安装 从 Zend Framework 的网页上下载最新版本.解压后,把整个目录拷贝到一个理想的地方,比如:/php/library/Zend. 打开 php.ini 文件,确认包含 Zend ...
- 转:Zend Framework 2.0 分析
文章来自于:http://bbs.phpchina.com/thread-268362-1-1.html ZF2已经发布,与ZF1相比,MVC这一模块内部的实现机制可谓大相径庭,许多用过ZF1的PHP ...
随机推荐
- Python3OS文件/方法
Python3OS文件/方法 os模块提供了非常丰富的方法用来处理文件和目录. 方法 描述 os.access(path,mode) 检验权限模式 os.chdir(path) 改变当前工作目录 os ...
- 《挑战30天C++入门极限》入门教程:实例详解C++友元
入门教程:实例详解C++友元 在说明什么是友元之前,我们先说明一下为什么需要友元与友元的缺点: 通常对于普通函数来说,要访问类的保护成员是不可能的,如果想这么做那么必须把类的成员都生命成为pu ...
- [NOI.AC]NOI2019省选模拟赛 第二场
传送门 Solution A. 一共有\(T\)组数据 每次询问你\([l,r]\)中有多少个数能被他的所有数位整除(如果数位中含有\(0\)忽略掉) 数位dp,咕咕咕 B. 题面略 考虑一个个只有两 ...
- Ubuntu16.04忘记MySQL5.7的root用户密码之解决方案
其实也就四步,如下: 修改配置文件 sudo vimi /etc/mysql/mysql.conf.d/mysqld.cnf 并在 在[mysqld]下方的skip-external-locking下 ...
- 20190710用控制台启动一个wcf服务
快速阅读 如何用控制台启动一个wcf服务,已经wcf的配置和在类库中如何实现 . wcf类库 用vs新建一个类库,引用system.ServiceModel 定义接口实现服务契约和操作契约 [Serv ...
- addEventListener与attachEvent区别
DOM2级事件处理程序 DOM2级事件定义了两个方法用于处理指定和删除事件处理程序的操作: addEventListener removeEventListener 所有的DOM节点都包含这两个方法, ...
- response.getWriter().println和@ResponseBody的比较及同时使用(用于回调函数)
@RequestMapping(value = "/test", method = { RequestMethod.GET, RequestMethod.POST }) @Resp ...
- Android通过ksoap2这个框架调用webservice大讲堂
昨天有人问我Android怎么连接mysql数据库,和对数据库的操作呀,我想把,给他说说json通信,可是他并不知道怎么弄,哎算了吧,直接叫他用ksoap吧,给他说了大半天,好多零碎的知识,看来还是有 ...
- (转)darknet 训练心得
1. 安装darknet 使用Git克隆源码 git clone https://github.com/pjreddie/darknet 我们可能需要修改Makefile,主要修改前三行,配置使用GP ...
- Maltego更新到4.2.4.12374
Maltego更新到4.2.4.12374 这次更新修改多个bug,并增加一些的特性和功能.主要变化如下: (1)允许用户直接复制实例的属性,以粘贴方式创建新实体. (2)右击网址类实体,右键菜单 ...