我正在开发一个ZF1 + Doctrine2应用程序,它有两个模块:默认是默认的标准网站,'rest'提供REST接口。很明显,两个模块使用相同的模型,因为它们共享许多常见的数据库操作。我的架构的目标是避免从控制器调用Doctrine EM方法,在它上面创建抽象层(一种API)以实现解耦和代码一致性(我个人有时不喜欢调用模型,有时在控制器中构建查询但我可能错了。)
我很想将模型放在库中(/library//Users/Users.php等),但不确定库是否合适,因为模型应该在应用程序文件夹中,它们不会扩展任何ZF类。但是库是整个应用程序之间的共享,这让我考虑到它。
我提出的其他选项是将它放在application / modules / default / models中,但如果我这样做,它在逻辑上与其他模块分开,尽管这些模型是全局的。
在这种情况下哪种解决方案更好,还是有其他方法我没有提及正确做到这一点?
答案 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命名空间。答案 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
我觉得以这种方式组织我的文件和类可以使代码尽可能干,而不会让人感到困惑和分散。
我希望这会有所帮助。