zend framework多模块多Layout配置
2013-08-23 16:38
543 查看
上次接触zend framework已经很久远了,10年的事情了。最近在做一个项目,时间不紧,就又把ZF拿出来折腾。而我发现以前做ZF的记忆已经在我脑中如梦幻泡影,消失无踪,为了配置多模块还又去查了资料,为了避免此种情况再次发生,做个记录吧。
首先,我们要新建一个ZF项目,目录结构如下。
我们想要配置多模块呢,首先要在,application下面建一个modules文件夹,然后创建模块文件夹,这里我以default和admin举例。default为前台,admin为后台,符合最基础的网站所需了。在modules下面新建default以及admin文件夹,然后分别把controllers,models以及views剪切到这两个文件夹内。此时,文件目录如下所示。并且将Bootstrap.php文件分别复制到两个目录里。
首先,我们去修改application.ini文件。删除以下这行。
然后添加以下内容。
这里我们看到,我们设置了default模块为默认模块。也就是说default模块里面的controller和model的类名都不需要另外处理,而其它模块里面的controller及model的类名都需要加模块前缀哦,这里后面会详细讲到。
然后我们去修改application/Bootstrap.php文件为以下内容。
到这里还没有结束,我们需要去修改对应的模块里面的Bootstrap.php文件的内容。
先修改application/modules/default/Bootstrap.php,修改为以下内容:
然后再修改为 application/modules/admin/Bootstrap.php,修改为以下内容:
以上的修改要注意两点,第一,注意类名需要加模块前缀,第二,注意模块里面的文件名继承的是Zend_Application_Module_Bootstrap而不是Zend_Application_Bootstrap_Bootstrap。如果继承文件错误的话,会报错:Maximum function nesting level of '100' reached, aborting!
我们再进行最后一步,就可以进行多模块的访问了。因为default是默认模块,所以我们不需要去修改,我们要去修改的是admin模块里面的内容。
打开admin模块里面的IndexController.php文件,修改类名为:
此时我们可以测试一下,我们访问http://localhost/project/public则访问的是default模块的首页,当访问http://localhost/project/public/admin时访问的是后台首页。
我们说完了多模块配置的contoller访问之后,再来提一下model的访问。
首先我们去修改配置文件,application.ini。在production中添加如下内容。
然后我们去连接数据库,在application/Bootstrap.php里面添加这个方法
先说default模块。
在application/default/models里面添加一个model文件,SmsInformation.php,此文件的内容为:
我们在在application/default/controller/IndexController.php中用以下语句则可实例化此model
然后说admin模块。
在application/admin/models里面添加一个model文件,SmsInformation.php,此文件的内容为:
请注意,类名有模块前缀哦。
我们在在application/admin/controller/IndexController.php中用以下语句则可实例化此model
最后还有layout配置,在两个模块下面分别新建layouts/scripts文件夹,里面放入默认布局文件layout.phtml。
目录结构如下:
layout.phtml的文件内容为:
将application.ini中加入两句话:
然后去修改application/Bootstrap.php文件。
在Bootstrap类中添加一个方法
在此文件中再添加一个类
对应的模块会去找到对应的layout。
再说几个layout的常见用法。
如果不使用layout,可用以下语句。
如果使用此模块中其它layout,可用以下语句。
到这里就一切OK了。
首先,我们要新建一个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 多模块 多模板配置
- Zend Framework 多模块配置 (一)
- Zend Framework项目搭建及多模块配置
- Zend Framework 配置一:多模块的配置方法
- zend framework多模块多布局配置
- zend framework多模块配置
- zend framework多模块配置
- zend framework多模块配置
- zend framework多模块多布局配置
- Zend Framework2 - Layout配置,不同模块Module设置不同的layout
- Zend Framework 多模块配置 (三)
- zend framework多模块多布局配置
- Python 解析配置模块之ConfigParser详解
- 高性能Web服务器Nginx的配置与部署研究(7)核心模块之主模块的非测试常用指令
- Nginx的特性与核心类别及配置文件和模块详解
- Struts文件上传及多模块调用的配置
- applicationContext.xml import spring模块配置文件
- iTop4412开发板的模块配置方法