我写了一个D6模块,它为用户提供了沟通,配置参数和测试第三方API服务的能力。
该模块按预期工作,但我想分离通信器类并将其捆绑为foo模块。然后将其余部分(管理页面)打包为foo-ui模块。就像观点和观点一样 - ui
我不知道这样做的最佳实践/设计模式是什么。有什么想法吗?
答案 0 :(得分:2)
据我所知,没有特定的模式,但总有一个问题:
- 为什么要将模块的逻辑和UI分成多个模块?这真的需要吗?
只有在您开发了可能接受views和simple views之类的不同用户界面的模块时,才需要这样做。国际海事组织没有其他理由这样做。
好的,假设我们的模块需要_ui
的东西。在这里,我尝试将模块的核心功能及其配置UI分开作为示例。看看Unfuddle API module,它是一个非常小巧简单的模块,适合我们的情况。这是$ tree ./unfuddle_api
:
unfuddle_api/
|-- LICENSE.txt
|-- README.txt
|-- unfuddle_api.classes.inc
|-- unfuddle_api.info
|-- unfuddle_api.install
|-- unfuddle_api.module
0 directories, 6 files
阅读其代码! unfuddle_api.install
正在安装任何架构,但在模块卸载时使用hook_uninstall()
实现variable_del()
删除一些变量。这些变量实际上是API连接参数,它们将在模块的管理页面中设置,您的模块中也可能有一些这些参数。
IMO这是要迁移到unfuddle_api_ui
模块的部分。
文件unfuddle_api.classes.inc
是unfuddle的API包装类,它以某种方式包含在一个用于实例化对象的类中的第三方代码。
IMO应保留在核心模块中。但是为了设计,我们必须通过删除variable_get()
调用并将传递的参数直接设置为类属性来更改构造函数方法。我们稍后会在.module
文件中添加它们。
文件unfuddle_api.module
包含主模块代码,hook_perm()
的实现加上hook_menu()
的实现以创建管理页面和名为unfuddle_api_create()
的辅助函数,这是某种方式一个Factory帮助器,用于Unfuddle
中编码的unfuddle_api.classes.inc
类创建对象
IMO两个钩子实现都应该移植到_ui
模块。此外,上面讨论的variable_get()
已移除的unfuddle_api.classes.inc
部分也应添加到unfuddle_api_create()
函数中。
所以,作为大纲:我们有一个unfuddle_api
模块,它充当Unfuddle
API类的包装器。它为我们提供了所有功能,但没有配置UI。所有配置都应通过代码中的unfuddle_api_create()
模块进行设置
我们还有一个unfuddle_api_ui
模块,该模块依赖于unfuddle_api
模块,如果启用,将为我们提供UI中的核心模块配置。
希望它有所帮助。
答案 1 :(得分:2)
对于不经常使用UI的模块也很有用。禁用UI可节省一些资源。 我建议您查看imagecache模块作为示例。 http://drupal.org/project/imagecache
答案 2 :(得分:1)
没有简单的答案。您需要从用户界面您自己强制执行功能分离。因此,您需要将程序的所有API放在一个模块中,将用户界面放在另一个模块中。使用simpletest模块为您的API编写测试用例。通过编写测试用例,您将成为API的“使用者”。实际上,您可以延迟UI的实现,以确保您在模块中具有负责“核心”功能的正确函数/类集。
您还应该浏览CTools模块。它提供了一些有用的工具,比如能够制作出口等等。
Drupal没有像Java或C#这样的书籍形式的大量文献。但PHP确实如此。查看有关PHP设计模式的书籍。虽然我还没有读过它,但Manning的“PHP in action”似乎在你所要求的东西上有很多东西。
另一种做这种事情的方法是看看其他人是如何做到的。 imagecache模块足够小,它将UI与功能分开(您需要启用单独的Imagecache UI模块)。为什么不实际探索imagecache的源代码? [视图是1 MB +源代码,所以探讨它可能不是一个好主意: - )]