Zend Framework 1.12中Module的用法

简介:

默认的,如果使用Zend studio的向导工具,生成的MVC目录结构如下:

%7D2CEO6YX6%7BRJVV)5%7BREAPNS

上面的那种目录结构,所有的controller,model和view文件都放在同一个目录下,如果项目很大的话,就不利于管理,为了便于管理,Zend Framework引入modules的概念,这样可以将controllers,models,views放入同一个Module。Module实际上是一个把MVC文件放在一起的一个文件夹而已。象上面的目录结构,没有用的Module。如果要使用Module,ZendFramework中通常有2种不同的目录结构(事实上也不一定必须采用这2种,可以自定义,但是通常都会采用下面的一种),如下图:

AWPVZE)WHL)%7BLS3_]VG1HI1229Y%60OISJ8WSN9WISB9R1[C



先看第一种,第一种就是在application目录下建2个不同的文件夹,一个是default,这个是ZF默认的module,另一个是Mymodule。建好后,还需要让ZF框架知道由于使用了Module导致controller的位置已经改变了。有2种方法,一种是写在application.ini配置文件中,还有一种是用代码实现。2种方法是等价的。

①如果写配置文件,只需要如下:

把原先的默认的controller配置注释掉(用分号注释)或者去掉,再加入新的路径。

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

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

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

配置好后,通过index.php中下面的语句,会读到有关的配置的。

// Create application, bootstrap, and run

$application = new Zend_Application(

   APPLICATION_ENV,

   APPLICATION_PATH . '/configs/application.ini'

);

②如果不采用修改配置文件的方法,那么直接在index.php文件夹加入如下代码:

1
2
3
4
Zend_Controller_Front::getInstance()->setControllerDirectory( array (
     'default'  => APPLICATION_PATH. '/default/controllers' ,
     'Mymodule'  => APPLICATION_PATH. '/Mymodule/controllers'
));

建议加在$application = new Zend_Application这句语句后面,如果写在这句话前面,还需要写如下代码去加载'Zend_Controller_Front'这个类库:

include_once "Zend/Loader.php";

Zend_Loader::loadClass('Zend_Controller_Front');

事实上,也可以使用addControllerDirectory方法。

其中Zend_Controller_Front::getInstance()获得了一个Zend_Controller_Front对象,该对象在ZF中被设计为一个单例模式,只需要获取就行了,不需要创建实例。这个类完成实例化对象、触发事件、建立默认的行为等,它的主要目的是处理所有进入应用的请求。

在2个IndexAction中对应的输入下面的代码,在Mymodule下的Action中的代码:

1
2
3
4
5
public  function  indexAction()
{
     var_dump(Zend_Controller_Front::getInstance()->getrequest());
     echo  "Hello from Mymodule indexAction" ;
}

在default下的Action中的代码:

1
2
3
4
5
   public  function  indexAction()
     {
         var_dump(Zend_Controller_Front::getInstance()->getrequest());
echo  "Hello from default indexAction" ;
     }

顺便把它们各自的view也改了,分别为:

1
< p >This default module Index.phtml</ p >

1
< p >This Mymodule module Index.phtml</ p >

接下来看看运行效果,输入http://localhost:8002/default/ ,浏览器界面如下:

2_O26(1)D%7D(ONJRPHDO@[1C

发现之前读到的Zend_Controller_Request_Http对象中的参数字段中,可以清楚的看到,我们已经获得了MVC的三个值了。

事实上,对于http://localhost:8002/这样的不输入default,系统也会默认的认为module是default,可以自行测试。



接着,输入url:http://localhost:8002/Mymodule/ (相关服务器配置要搞定),这时候会发现页面报错。

I{}SHSXI1DP8)@YD%Z4TXRW

这是怎么回事?肯定哪里出错了。原来使用Module后,ZF有个约定,就是必须把Module对应的Controller的类名(不是文件名)比较加上前缀,前缀的格式为Module名+下划线_。而对于名称为default的Module,则不需要加前缀。在配置文件中,之前设置的Module名就是MyModule,_JM@XVZN]UU2BV@(2$I)FL0

因此把Mymodule文件夹中的IndexController.php中的类名改成Mymodule_IndexController。如果该Module名设成aaa,那么就改成aaa_IndexController

。通常为了便于管理,Module名和文件夹名都是一致的。再次运行http://localhost:8002/Mymodule/

Z)CSL6N2%%33}~``Z@_R@YH

终于成功了。注意URL中的module路径的大小写和配置中的大小写要一致。


对于第二种目录结构,同样有两种方式让ZF框架知道我们已经采用了module,和之前的方法一样,写配置文件和写代码:

①如果写配置文件,和第一种其实是一样的,把原先默认的配置文件注释掉或者去掉。把路径设置对。

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

resources.frontController.controllerDirectory.default =APPLICATION_PATH"/HereIsModules/default/controllers"

resources.frontController.controllerDirectory.Mymodule =APPLICATION_PATH"/HereIsModules/Mymodule/controllers"

②如果不采用修改配置文件的方法,那么也是和第一种一样,直接在index.php文件夹加入如下代码:

1
2
3
4
Zend_Controller_Front::getInstance()->setControllerDirectory( array (
     'default'  => APPLICATION_PATH. '/HereIsModules/default/controllers' ,
     'Mymodule'  => APPLICATION_PATH. '/HereIsModules/Mymodule/controllers'
));

其后的操作和之前的操作一样。

事实上,无论采用哪种Module的目录方式,只要配置对了路径,都是等价的。而如果不采用Module,系统也会自己为module参数加上'default'。

由于ZF的默认路由结构就是:module/:controller/:action/*和:controller/:action/*,因此在不采用module的文件结构下,输入url:http://localhost:8003/defaulthttp://localhost:8003/是等价的,ZF会自动匹配路由结构,获取到对应的:module/:controller/:action/的值。






















本文转自cnn23711151CTO博客,原文链接:http://blog.51cto.com/cnn237111/1290458 ,如需转载请自行联系原作者








相关文章
|
9月前
|
数据挖掘 程序员 Python
【Python】已解决:ModuleNotFoundError: No module named ‘Workbook’
【Python】已解决:ModuleNotFoundError: No module named ‘Workbook’
173 0
|
9月前
|
自然语言处理 数据处理 Python
【Python】已解决:ModuleNotFoundError: No module named ‘LAC‘
【Python】已解决:ModuleNotFoundError: No module named ‘LAC‘
128 0
|
Python
Python3 多线程问题:ModuleNotFoundError: No module named 'thread',原因及解决办法。
Python3 多线程问题:ModuleNotFoundError: No module named 'thread',原因及解决办法。
1392 0
PYTHON3.x报错:MODULENOTFOUNDERROR:NO MODULE NAMED “CRYPTO“ 解决方案
PYTHON3.x报错:MODULENOTFOUNDERROR:NO MODULE NAMED “CRYPTO“ 解决方案
213 0
Python3.6报错:ModuleNotFoundError: No module named 'MySQLdb'
Python3.6报错:ModuleNotFoundError: No module named 'MySQLdb'
217 0
|
Python
Python编程:uWSGI配置报错ModuleNotFoundError: No module named 'flask'
Python编程:uWSGI配置报错ModuleNotFoundError: No module named 'flask'
571 0
|
Python
python报错 ModuleNotFoundError: No module named ‘lxml‘
python报错 ModuleNotFoundError: No module named ‘lxml‘
813 0
|
Windows Python
Python 库安装提示:ModuleNotFoundError: No module named ‘windows‘. 问题解决方法
Python 库安装提示:ModuleNotFoundError: No module named ‘windows‘. 问题解决方法
697 0
Python 库安装提示:ModuleNotFoundError: No module named ‘windows‘. 问题解决方法
|
API Python Windows
成功解决Scrapy框架的问题ModuleNotFoundError: No module named 'win32api'
成功解决Scrapy框架的问题ModuleNotFoundError: No module named 'win32api'
成功解决Scrapy框架的问题ModuleNotFoundError: No module named 'win32api'
关于 Mac OSX下运行Python程序调用tools库的问题,ModuleNotFoundError: No module named ‘Tools‘
关于 Mac OSX下运行Python程序调用tools库的问题,ModuleNotFoundError: No module named ‘Tools‘