转自: 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文件。删除以下这行。

  1. resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"

然后添加以下内容。

  1. resources.frontController.controllerDirectory.default =APPLICATION_PATH "/modules/default/controllers"
  2. resources.frontController.controllerDirectory.admin =APPLICATION_PATH "/modules/admin/controllers"
  3. resources.FrontController.moduleDirectory =APPLICATION_PATH "/modules"
  4. resources.FrontController.moduleControllerDirectoryName ="controllers"
  5. resources.FrontController.defaultModule= "default"
  6. resources.modules[] = ""

这里我们看到,我们设置了default模块为默认模块。也就是说default模块里面的controller和model的类名都不需要另外处理,而其它模块里面的controller及model的类名都需要加模块前缀哦,这里后面会详细讲到。

然后我们去修改application/Bootstrap.php文件为以下内容。

  1. <?php
  2. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  3. {
  4. protected function _initAppAutoload() {
  5. $autoloader = new Zend_Application_Module_Autoloader(array(
  6. 'namespace' => 'App',
  7. 'basePath'  => dirname(__FILE__),
  8. ));
  9. return $autoloader;
  10. }
  11. }

到这里还没有结束,我们需要去修改对应的模块里面的Bootstrap.php文件的内容。

先修改application/modules/default/Bootstrap.php,修改为以下内容:

  1. <?php
  2. class Default_Bootstrap extends Zend_Application_Module_Bootstrap {
  3. protected function _initAutoload() {
  4. $autoloader = new Zend_Application_Module_Autoloader(array(
  5. 'namespace' => '',
  6. 'basePath' => APPLICATION_PATH . '/modules/default'));
  7. return $autoloader;
  8. }
  9. }

然后再修改为 application/modules/admin/Bootstrap.php,修改为以下内容:

  1. <?php
  2. class Admin_Bootstrap extends Zend_Application_Module_Bootstrap {
  3. protected function _initAutoload() {
  4. $autoloader = new Zend_Application_Module_Autoloader(array(
  5. 'namespace' => '',
  6. 'basePath' => APPLICATION_PATH . '/modules/admin'));
  7. return $autoloader;
  8. }
  9. }

以上的修改要注意两点,第一,注意类名需要加模块前缀,第二,注意模块里面的文件名继承的是 Zend_Application_Module_Bootstrap而不是 Zend_Application_Bootstrap_Bootstrap。如果继承文件错误的话,会报错:Maximum function nesting level of '100' reached, aborting!

我们再进行最后一步,就可以进行多模块的访问了。因为default是默认模块,所以我们不需要去修改,我们要去修改的是admin模块里面的内容。

打开admin模块里面的IndexController.php文件,修改类名为:

  1. class Admin_IndexController extends Zend_Controller_Action
  2. {
  3. }

此时我们可以测试一下,我们访问http://localhost/project/public则访问的是default模块的首页,当访问http://localhost/project/public/admin时访问的是后台首页。

我们说完了多模块配置的contoller访问之后,再来提一下model的访问。

首先我们去修改配置文件,application.ini。在production中添加如下内容。

  1. db.adapter = PDO_MYSQL
  2. db.params.host = localhost
  3. db.params.dbname = voice_sms
  4. db.params.username = root
  5. db.params.password = 123456
  6. db.params.charset = UTF8

然后我们去连接数据库,在application/Bootstrap.php里面添加这个方法

  1. protected function _initDatabase() {
  2. $options = $this->getApplication()->getOptions();
  3. $db = Zend_Db::factory( $options[ 'db' ][ 'adapter' ], $options[ 'db' ][ 'params' ] );
  4. Zend_Db_Table_Abstract::setDefaultAdapter( $db );
  5. Zend_Registry::set( 'DB', $db );
  6. return $db;
  7. }

先说default模块。

在application/default/models里面添加一个model文件,SmsInformation.php,此文件的内容为:

  1. class Model_SmsInformation
  2. {
  3. private $_tableName;
  4. private $_connect;
  5. /**
  6. * construct function
  7. */
  8. public function __construct() {
  9. $this->_tableName = 'smsinformation';
  10. $this->_connect= Zend_Registry::get( 'DB' );
  11. }
  12. }

我们在在application/default/controller/IndexController.php中用以下语句则可实例化此model

  1. $smsInformationModel = new Model_SmsInformation();

然后说admin模块。

在application/admin/models里面添加一个model文件,SmsInformation.php,此文件的内容为:

  1. class Admin_Model_SmsInformation
  2. {
  3. private $_tableName;
  4. private $_connect;
  5. /**
  6. * construct function
  7. */
  8. public function __construct() {
  9. $this->_tableName = 'smsinformation';
  10. $this->_connect= Zend_Registry::get( 'DB' );
  11. }
  12. }

请注意,类名有模块前缀哦。

我们在在application/admin/controller/IndexController.php中用以下语句则可实例化此model

  1. $smsInformationModel = new Admin_Model_SmsInformation();

最后还有layout配置,在两个模块下面分别新建layouts/scripts文件夹,里面放入默认布局文件layout.phtml。

目录结构如下:

layout.phtml的文件内容为:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <?php $baseUrl = $this->baseUrl();?>
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <?php
  7. echo $this->headTitle();
  8. $this->headLink()->appendStylesheet($baseUrl . "/css/admin.css");
  9. echo $this->headLink();
  10. $this->headScript()->appendFile($baseUrl . "/js/jquery-2.0.2.min.js");
  11. echo $this->headScript();
  12. ?>
  13. </head>
  14. <body>
  15. <div class="container">
  16. <?php echo $this->layout()->content; ?>
  17. </div>
  18. </body>
  19. </html>

将application.ini中加入两句话:

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

然后去修改application/Bootstrap.php文件。

在Bootstrap类中添加一个方法

  1. /**
  2. * about multi-layout configuration
  3. */
  4. protected function _initLayoutHelper()
  5. {
  6. $this->bootstrap('frontController');
  7. $layout= Zend_Controller_Action_HelperBroker::addHelper(
  8. new Rockux_Controller_Action_Helper_LayoutLoader());
  9. }

在此文件中再添加一个类

  1. /**
  2. * Layout
  3. *
  4. * @package   Applicaiton
  5. * @author    Qiao Chen <cq279286727@sina.com>
  6. * @version   $$Id: Bootstrap.php  2013-9-22
  7. */
  8. class Rockux_Controller_Action_Helper_LayoutLoader extends Zend_Controller_Action_Helper_Abstract
  9. {
  10. public function preDispatch(){
  11. $bootstrap=$this->getActionController()->getInvokeArg('bootstrap');
  12. $config=$bootstrap->getOptions();
  13. $module=$this->getRequest()->getModuleName();
  14. if(isset($config[$module]['resources']['layout']['layoutPath'])){
  15. $layoutPath=$config[$module]['resources']['layout']['layoutPath'];
  16. $this->getActionController()->getHelper('layout')->setLayoutPath($layoutPath);
  17. }
  18. }
  19. }

对应的模块会去找到对应的layout。

再说几个layout的常见用法。

如果不使用layout,可用以下语句。

  1. $this->_helper->layout()->disableLayout();

如果使用此模块中其它layout,可用以下语句。

  1. $this->_helper->layout()->setLayout("loginlayout");

到这里就一切OK了。

zend framework多模块多Layout配置的更多相关文章

  1. zend framework多模块配置

    上次接触zend framework已经很久远了,10年的事情了.最近在做一个项目,时间不紧,就又把ZF拿出来折腾.而我发现以前做ZF的记忆已经在我脑中如梦幻泡影,消失无踪,为了配置多模块还又去查了资 ...

  2. Zend Framework(一) windows8.1下配置zend framework1.12

    windows8.1下配置zend framework1.12配置步骤: 1.     下载 zend framework1.12库 2.      创建zend frameworkproject 2 ...

  3. zend framework 1.10项目配置与经典hello world

    准备工作 前置条件:PHP>=5.14,Apache开启mod_rewrite支持,开启php的pdo扩展. Zend Framework 要求 PHP版本不低于5.1.4,但强烈建议使用 5. ...

  4. Zend Framework Module之多模块配置

    摘要:该文将为大家简单介绍一下如何使用zend framework创建模块化的应用程序. zend framework对多模块的支持是很好的,但是可能是由于功能太过强大的缘故,部署起来并不是很容易.许 ...

  5. 主流PHP框架间的比较(Zend Framework,CakePHP,CodeIgniter,Symfony,ThinkPHP,FleaPHP)

    Zend Framework 优点: Zend Framework大量应用了PHP5中面向对象的新特征:接口.异常.抽象类.SPL等等.这些东西的应用让Zend Framework具有高度的模块化和灵 ...

  6. Zend Framework 1 - Quick Start

    创建 Zend 项目 要创建 Zend 项目,首先要下载并解压 Zend Framework. 安装 Zend Framework 下载最新的 Zend Framework 1.12.20 源码包,( ...

  7. Zend Framework 入门(4)—页面布局

    Zend Framework 的页面布局模块——Zend_Layout——既可以跟 MVC 一起使用,也可以单独使用.本文只讨论与 MVC 一起使用的情况. 1. 布局脚本 在 application ...

  8. Zend Framework 入门(1)—快速上手

    1. 安装 从 Zend Framework 的网页上下载最新版本.解压后,把整个目录拷贝到一个理想的地方,比如:/php/library/Zend. 打开 php.ini 文件,确认包含 Zend ...

  9. 转:Zend Framework 2.0 分析

    文章来自于:http://bbs.phpchina.com/thread-268362-1-1.html ZF2已经发布,与ZF1相比,MVC这一模块内部的实现机制可谓大相径庭,许多用过ZF1的PHP ...

随机推荐

  1. PowerBuilder 这么古老的语言(破解一软件)

     PowerBuilder 这么古老的语言,编辑器用的6.5的好古老的气息,好吧破解木有兴趣了, 不过嘛可以说一下破解思路,这个系统使用的是圣天狗,联网版的. 复制狗(暴力,没技术味道) 模拟狗(也是 ...

  2. 主要排序算法(Python实现)

    1. 冒泡排序 算法描述:1. 比较相邻的两个数,对升序(/降序)而言,若当前数小于(大于)后一个数则交换两者的位置. 2.那么循环长度为L的列表,从第一个元素到倒数第(L-1)元素进行第1步操作,其 ...

  3. 团队作业-Alpha(1/4)

    队名:软工9组 组长博客: https://www.cnblogs.com/cmlei/ 作业博客: 组员进度 ● 组员一(组长) 陈明磊 ○过去两天完成了哪些任务 ●文字/口头描述 初步学习flas ...

  4. Andorid SQLite数据库开发基础教程(3)

    Andorid SQLite数据库开发基础教程(3) 数据库生成方式 数据库的生成有两种方式,一种是使用数据库管理工具生成的数据库,我们将此类数据库称为预设数据库,另一种是使用代码生成的数据库. 使用 ...

  5. flutter Sliver滑动视图组件

    import 'package:flutter/material.dart'; import './model/post.dart'; class SliverDemo extends Statele ...

  6. 为什么static成员必须在类外初始化,而不能在类的头文件中初始化

    为什么static成员必须在类外初始化 为什么静态成员不能在类内初始化 在C++中,类的静态成员(static member)必须在类内声明,在类外初始化,像下面这样.   class A { pri ...

  7. Java8的时间日期API

    原先的时间 api  大部分已经过时了 Date构造器 需要传入年月日  但是对时间的加减操作比较麻烦 Calenda  加减比较方便 使用 LocalDate. LocalTime. LocalDa ...

  8. Spring cloud微服务安全实战-3-7API安全机制之数据加密

    这一节来聊一下密码的加密. 加密盐,为了避免两个相同的面加密出来的密文是一样的,每个人的盐不一样, 首先引入工具包,lambdaworks <!-- https://mvnrepository. ...

  9. 如何把VMware Workstation使用的虚拟SCSI磁盘转换成虚拟IDE硬盘

    如何把VMware Workstation使用的虚拟SCSI磁盘转换成虚拟IDE硬盘  摘自:http://blog.sina.com.cn/s/blog_7525b71f0101d0u8.html ...

  10. Qt编写自定义控件69-代码行数统计

    一.前言 代码行数统计主要用来统计项目中的所有文件的代码行数,其中包括空行.注释行.代码行,可以指定过滤拓展名,比如只想统计.cpp的文件,也可以指定文件或者指定目录进行统计.写完这个工具第一件事情就 ...