Zend Framework扩展模块控制器

时间:2011-10-26 15:19:15

标签: php zend-framework

我的网站结构目前是这样的:

/cms/
   /data/ - caches etc
   /modules/
   /public/ - aliases from site public folders
/website1
    /images
    /layouts, views, scripts, css etc
    (no index.php because of the alias)

这很好用,我的系统查找别名文件夹来运行应用程序。但是,我现在已经到了想要扩展其中一个模块控制器的地步。

理想情况下,我的结构将是:

/cms/
   .. as above
   /CLIENT_ID/
       /modules
           ..extending/overriding scripts 

但是,这就是问题:必须根据Zend的文件名结构(Module_IndexController等)调用要调用的控制器,因此扩展基类将是:

Module_IndexController extends Module_IndexController 

这显然不会很好用。我的想法应该是:

CLIENTID_Module_IndexController extends Module_IndexController 

但是我一直坚持如何实现这个想法?我可以在前端控制器上使用:addControllerDirectory添加控制器目录,但我猜我需要在某处更改被调用的类名?

然后我可以检查文件夹是否是目录并运行覆盖类而不是基类。

有什么想法吗?我愿意重组文件夹,但显然需要将媒体文件保存在公共文件夹中。

2 个答案:

答案 0 :(得分:0)

问题是你没有使用Zend_Dispatcher,Zend_Autoloader和Zend_Controller编写的conventional directory structure

在我看来,你有两种可能的解决方案:

  1. 自定义 Zend_Autoloader和Zend_Controller以及Zend_Dispatcher。您可以找到可能的自定义设置hereherehere
  2. 修改目录结构。
  3. 在第二种情况下,考虑可能的项目选择:

    • 为所有网站创建独立的独立zend框架项目,并在那些CMS文件夹的别名中创建
    • 与之前一样,但使用以下方法自定义模块位置: http://framework.zend.com/manual/en/zend.controller.modular.html#zend.controller.modular.directories
    • 将CMS 用作库:将所有cms文件放在/websiteN之外的文件夹中,然后放入您设置includePaths.library = /path/to/cms/folder"的websiteN的application.ini中。在这种可能性中存在许多可能的问题,必须在了解您的项目时进行评估。通过这种方式,您可以调用模型,扩展网站的类来扩展cms,但是您不能将您的cms用作variuos级别的用户交互的入口点和管理者。

答案 1 :(得分:0)

正如您所说,您可以告诉Zend每个模块的基本控制器目录。

$controller = Zend_controller_Front::getInstance();
$controller->setControllerDirectory(
     array("module_name" => "directory_path")
);

我认为Zend希望命名约定是ClientId_Module_Controller。但是,如果您真的遇到了命名约定,并且正在使用php 5.3,那么您可以使用命名空间。