默认的,如果使用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文件夹加入如下代码:

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中的代码:

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

在default下的Action中的代码:

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

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

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

<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文件夹加入如下代码:

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/的值。