在多个模块中使用的模型。它应该放在哪里?

时间:2012-05-18 23:29:08

标签: zend-framework

我正在开发一个ZF1 + Doctrine2应用程序,它有两个模块:默认是默认的标准网站,'rest'提供REST接口。很明显,两个模块使用相同的模型,因为它们共享许多常见的数据库操作。我的架构的目标是避免从控制器调用Doctrine EM方法,在它上面创建抽象层(一种API)以实现解耦和代码一致性(我个人有时不喜欢调用模型,有时在控制器中构建查询但我可能错了。)

我很想将模型放在库中(/library//Users/Users.php等),但不确定库是否合适,因为模型应该在应用程序文件夹中,它们不会扩展任何ZF类。但是库是整个应用程序之间的共享,这让我考虑到它。

我提出的其他选项是将它放在application / modules / default / models中,但如果我这样做,它在逻辑上与其他模块分开,尽管这些模型是全局的。

在这种情况下哪种解决方案更好,还是有其他方法我没有提及正确做到这一点?

2 个答案:

答案 0 :(得分:2)

我尝试保留我的库文件夹以用于跨项目的东西,我放入的libs的一种供应商文件夹,可以直接使用,也可以在我自己的类中扩展(根据需要添加autoloadernamespaces条目)。

在多模块应用程序中,我保留跨模块的东西 - 比如通用模型,映射器,视图助手和将由所有模块使用的部分脚本 - 在应用程序级别,使用appnamespace命名({{ 1}}或Application_或某些此类事物)。然后,我推送所有模块 - 包括默认模块! - 进入My_文件夹。特定于模块的东西 - 比如控制器,表单,视图 - 然后用模块名称命名。类似的东西:

modules

通常,模块引导类 - 扩展/application /configs application.ini /layouts /models # app-level! /modules /admin /controllers /forms /models /views /helpers /scripts /front /controllers /forms /models /views /helpers /scripts /views # app-level! /helpers /scripts /data /cache /library /App /Zend /public index.php /assets /css /img /js /scripts - 注册正确的资源自动加载器映射,以使对象实例化变得轻而易举。

一个注意事项:由于我更喜欢​​我的控制器使用它们所在的模块命名空间,我需要在前控制器上设置一个参数,让他知道:

Zend_Application_Module_Boostrap

tl:dr:

  • 跨项目类驻留在resources.frontController.params.prefixDefaultModule = true 中,并使用自己的lib命名空间。
  • 应用级,跨模块类驻留在应用级别并使用appnamespace
  • 模块级类驻留在模块文件夹中,并使用模块命名空间

答案 1 :(得分:1)

ZF 1.x并不是模块化的,我认为ZF 1.x中的模块有点用词不当。在我看来,它们更像是域库。话虽如此, 我看这样的代码分离(纯粹意见)。

  • 我希望在我放入库中的另一个项目中重用或重用的任何代码。例如。查看助手,动作助手,抽象模型类,基础模型,插件等......

  • 任何特定于应用程序的代码,将在我放在应用程序级目录中的应用程序中普遍使用。这就像具体的数据映射器,DbTable模型(我不使用Doctrine),表单和布局......

  • 任何专门属于模块(域)的代码,不会或不能在我放在模块级目录中的任何其他地方使用。这包括特殊视图和动作助手之类的东西,其中一种形式,而且主要是我放置我的域(实体)模型的地方。

为了说明这一点,我将提供一个例子(省略个人命名空间):

我的应用程序中有一个名为 music 的模块,该模块有一个名为'music'的数据库表
所以这些是我在模块中使用这个Db表的文件。

//The DbTable model
application
    /models
        /DbTable
            /Music.php //extends Zend_Db_Table_Abstract

要使用该DbTable模型,我构建了一个使用2个文件的映射器

//Base mapper class
library
    /Application
        /Model
            /Mapper.php
//The concrete mapper
application
    /modules
        /models
            /MusicMapper.php //extends Namespace_Application_Model_Mapper

并使用该映射器我将拥有一个由2个文件组成的域模型,一个基本实体类和具体的实体类。

//Base entity class
library
    /Application
        /Model
            /Entity.php

//and the concrete entity class
application
    /modules
        /models
            /Music.php //extends Namespace_Application_Model_Entity

我觉得以这种方式组织我的文件和类可以使代码尽可能干,而不会让人感到困惑和分散。

我希望这会有所帮助。