2011-10-26 116 views
0

我的网站结构是目前这样的: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,但我猜我需要在某处更改被调用的类名称?

然后我可以检查文件夹是否是一个目录,并运行重写类而不是基类。

任何想法?我愿意重建这些文件夹,但显然需要将媒体文件保存在公用文件夹中。

回答

0

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

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

  1. 定制 Zend_Autoloader和Zend_Controller的和Zend_Dispatcher。您可以找到可能的自定义hereherehere
  2. 修改的目录结构。

在第二种情况下考虑theese可能projectual选择:

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

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

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

我认为Zend公司希望的命名约定是ClientId_Module_Controller。但是,如果你真的被命名约定困住了,并且正在使用php 5.3,你可以使用命名空间。