Php 分离Drupal模块逻辑和UI

Php 分离Drupal模块逻辑和UI,php,drupal,drupal-6,drupal-modules,Php,Drupal,Drupal 6,Drupal Modules,我编写了一个D6模块,它为用户提供了通信、配置参数和测试第三方API服务的能力。 该模块按预期工作,但我想分离communicator类并将其捆绑为foo模块。然后将其余部分(管理页面)打包为FooUI模块。就像视图和视图ui一样。 我不知道这样做的最佳实践/设计模式是什么。有什么想法吗?没有简单的答案。您需要强制将功能与用户界面分离。因此,您需要将程序的所有API放在一个模块中,将用户界面放在另一个模块中。使用模块为您的API编写测试用例。通过编写测试用例,您将成为API的“消费者”。事实上,

我编写了一个D6模块,它为用户提供了通信、配置参数和测试第三方API服务的能力。
该模块按预期工作,但我想分离communicator类并将其捆绑为foo模块。然后将其余部分(管理页面)打包为FooUI模块。就像视图和视图ui一样。

我不知道这样做的最佳实践/设计模式是什么。有什么想法吗?

没有简单的答案。您需要强制将功能与用户界面分离。因此,您需要将程序的所有API放在一个模块中,将用户界面放在另一个模块中。使用模块为您的API编写测试用例。通过编写测试用例,您将成为API的“消费者”。事实上,您可以将UI的实现延迟足够长的时间,以确保在负责“核心”功能的模块中拥有正确的函数/类集

此外,您还应该探索该模块。它提供了一些有用的工具,比如能够制作可导出的东西等等

Drupal没有像Java或C#这样丰富的书籍形式的文献。但PHP确实如此。查看有关PHP设计模式的书籍。虽然我还没有读过它,但曼宁的《PHP在行动》似乎有很多东西都是关于你所要求的东西的


做这些事情的另一种方法是看看别人是怎么做的。imagecache模块足够小,它将UI与功能分开(您需要启用一个单独的imagecache UI模块)。为什么不实际探索imagecache的源代码呢?[Views是1 MB+的源代码,所以现在探索它可能不是一个好主意:-)

正如我所知,没有特定的模式,但始终存在一个问题:

--为什么我要将模块的逻辑和UI分为多个模块?真的需要吗

只有当您开发了一个模块,可以像和一样接受不同的UI时,才需要它。海事组织没有其他理由这样做

好的,假设我们的模块需要
\u ui
东西。在这里,我尝试将模块的核心功能与其配置UI分开作为一个示例。看一看,这是一个非常小和简单的模块,适合我们的情况。这是
$tree./unfuddle\u 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\u api.install
不安装任何架构,而是在模块卸载时使用
variable\u del()
执行
hook\u uninstall()
删除一些变量。这些变量实际上是API连接参数,将在模块的管理页面中设置,您的模块中可能也会有一些参数。
在我看来,这是要迁移到
unfuddle\u api\u ui
模块的一部分

文件
unfuddle_api.classes.inc
是的api包装类,它不知何故是包装在类中的第三方代码,将用于实例化对象。
海事组织,这应保留在核心模块中。但是为了便于设计,我们必须通过删除
variable\u get()
调用并直接将传递的参数设置为类属性来更改构造函数方法。我们稍后将在
.module
文件中添加它们

文件
unfuddle\u api.module
包含主模块代码,
hook\u perm()
的一个实现加上一个用于
hook\u menu()
以创建管理页面和名为
unfuddle\u api\u create()的帮助函数
它是从
Unfuddle
类创建对象的一个助手,该类在
Unfuddle\u api.classes.inc
中编码 IMO两个钩子实现都应该移植到
\uUI
模块。此外,上文讨论的
unfuddle\u api.classes.inc
中删除的
变量\u get()
部分应添加到
unfuddle\u api\u create()
函数中

因此,作为一个概要:我们有一个
unfuddle_api
模块,它充当
unfuddle
api类的包装器。它为我们提供了所有功能,但没有配置UI。所有配置都应通过代码中的
unfuddle\u api\u create()
模块进行设置。
此外,我们还获得了一个
unfuddle\u api\u ui
模块,该模块依赖于
unfuddle\u api
模块,如果启用,将为我们提供ui中的核心模块配置


希望它有帮助。

对于不使用UI offten的模块也很有用。禁用UI可以节省一些资源。
我建议您以imagecache模块为例进行检查

谢谢,我已经为API及其包装器编写了测试用例,它们是模块的核心功能。我认为有一个特定的模式来分离Drupal模块的逻辑和ui。再次感谢。曼宁回答+1和“PHP在行动”回答+1。我还推荐Zandra的第二版PHP对象、模式和实践