0

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

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

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

在这种情况下哪种解决方案更好,或者还有其他我没有提到的正确方法吗?

4

2 回答 2

2

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

在多模块应用程序中,我在应用程序级别保留跨模块的东西——比如公共模型、映射器、视图帮助程序和将被所有模块使用的部分脚本——用 appnamespace 命名(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- 注册正确的资源自动加载器映射,使对象实例化变得轻而易举。

注意:由于我更喜欢​​我的控制器使用它们所在的模块命名空间,因此我需要在前端控制器上设置一个参数以让他意识到这一点:

resources.frontController.params.prefixDefaultModule = true

tl:博士:

  • 跨项目类驻留在library并使用它们自己的 lib 命名空间。
  • 应用级别的跨模块类驻留在应用级别并使用应用命名空间
  • 模块级类驻留在模块文件夹中并使用模块命名空间
于 2012-05-19T13:07:06.407 回答
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

我觉得以这种方式组织我的文件和类可以使代码尽可能干燥,而不会过于混乱和分散。

我希望这有帮助。

于 2012-05-19T08:40:44.773 回答