模块中的Zend模块

时间:2010-11-04 13:52:55

标签: zend-framework module

我想知道可以在模块中创建模块结构(或者看起来像这样的东西)

目前我使用管理模块,使用这样的网址:

public/admin/index/index

具有如下文件夹结构:

applications
-- modules
---- admin
------ controllers
------ views [and so on]

我想使用这些网址:

public/admin/news/index/index
public/admin/gallery/index/index

新闻和图库是模块

文件夹结构如下所示

applications
-- modules
---- admin
------ controllers
------ views
-------- scripts
---------- modules
------------ news
-------------- controllers
-------------- views [and so on]
------------ gallery
-------------- controllers
-------------- views [and so on]

这可能吗?我尝试在我的引导程序中添加另一个模块:

$moduleLoader = new Zend_Application_Module_Autoloader(array(
            'namespace' => 'Module',
            'basePath' => APPLICATION_PATH . '/modules/admin/views/scripts/modules'));

但这没有成功。 我可以创建新闻,图库和这样的模块,并在我的管理布局中加载它们。一切都将与管理员的其他人一样,但我宁愿看到它(如果可能的话)

如果我想完全没有问题或有任何提示,想法,请告诉我。

2 个答案:

答案 0 :(得分:11)

模块是逻辑链接功能的集合(例如,图库)。为了简单起见,您应该将模块的所有相关代码存储在其目录中(这还包括任何管理任务)。在您的adminModule中,您拥有其他几个模块的代码,这使得两个模块都难以重用,因为它们都依赖于AdminModule,而AdminModule依赖于所有其他模块。这完全打破了模块的想法。如果它有助于理解,你可以看到控制器作为子模块(我知道它是错的,但也许它使理解更容易)。

首先你可以这样做:

  • 图库模块
    • ImageController(viewAction,browseAction,...)
    • AdminController(editImage,uploadImage,...)
    • ...
  • 用户模块
    • SettingsController
    • AdminController
    • ...

但是,您再次将一个实体的代码拆分为不同的控制器。就像在ImageController中一样,您可以处理图像的查看,但编辑和上传是在AdminController中完成的 所以(至少我是这样做的):

  • 图库模块
    • ImageController(viewAction,addAction,editAction,deleteAction,...)
    • GalleryContoller(viewAction,addAction,editAction,deleteAction,...)
    • ....

这使逻辑上属于一起的所有东西保持在一起。一个控制器负责一个实体的所有操作(如关于一个图像的所有操作的ImageController,关于gallerys的操作的GalleryController)。这还包括管理任务 如果你这样做,可能没有真正的AdminModule。它只是链接到每个模块/控制器的管理操作的某种导航。

您确定可以重写zf以支持子模块。这将涉及:

  • 添加支持子模块的路由(简单的路径)
  • 重写Dispatcher以支持子模块
  • 为子模块重写Autoloader
  • 将其他几个目录添加到Plugin-Loaders&其他

但是我没见过任何mvc框架,因为这通常意味着设计缺陷(再次,在我的意见中)和一般性能松散(查找自动加载器的目录越多越糟糕)。

答案 1 :(得分:0)

ZF目录结构可自定义,主要由:

  • 前端控制器选项(例如setControllerDirectory()addPluginPath()等。)
  • 查看选项(addPath()addHelperPath()
  • 自动加载器,例如模块bootstraps中的_resourceLoader