在Zend Framework 0.6的时候,控制器的模块功能已经实现了,但是有个Bug并不能用。不过到Zend Framework 0.7版的时候已经解决了。所以,我马上在项目中运用这个特性。虽然文档和邮件列表里面有谈到,但我在移植的时候还是出现了一些小问题,所以还是罗嗦一下。
当你的项目慢慢变得复杂的时候,控制器目录会有很多文件,这样很不好管理(如果你全写在一个控制器里面,那我就无语了……)。所以,在Zend Framework里面实现了多个模块功能,让你设置不同的控制器目录,一个目录代表不同的模块。这样就可以把相关的控制器放在一起了。好了,实战开始:
首先说一下,我的控制器目录结构/controllers,然后,我需要把管理的控制器单独放在一个目录/controllers/Admin(!注意这里需要大写)。当然你可以这目录放在任意的地方。那么在设置控制器目录的时候就要修改一下:
$controller->setControllerDirectory(array(
'default' => $_SERVER['DOCUMENT_ROOT'].'/core/controllers',
'admin' => $_SERVER['DOCUMENT_ROOT'].'/core/controllers/Admin'));
然后,添加下面这段代码。以打开模块功能。
$controller->setParam('useModules', true);
这样,你就可以在/controllers/Admin中创建控制器了。比如创建一个FileController.php,路径如下:/controllers/Admin/FileController.php。类名需要写成模块名_文件名,所以这个控制器的类名是Admin_FileController。然后,该写什么的就写什么。
现在,就可以通过http://yourdomain/admin/file,来访问这个控制器了。
不过最终还是有点点小问题,就是在模块下,好象并不支持IndexController.php。这点可以通过使用RewriteRouter来帮我们一下。至于怎么使用RewriteRouter可以看我的另一篇网志。
$router->addRoute('admin', new Zend_Controller_Router_Route('/admin', array('controller' => 'admin_index', 'action' => 'index')));
昨天,在移植的时候,发现本机是好的(windows平台),一放到服务器上面就broken。后来一想,由于linux平台是区分大小名的。后来,我把Admin_FileController类名改成admin_FileController,模块名为admin。不过好像不好使……