我打算用ZF2创建一个新项目。事实上,我必须升级ZF1项目,但我决定从头开始。
我的项目非常庞大,已经被来自世界各地的志愿者翻译成10种不同的语言。
我遇到的困难是对ZF2告诉我遵循的模块结构的分析。
该软件允许ISP领域的中小企业管理其客户数据库,服务,订单,发票,域名,技术支持,电子商务,kb等等。
假设ZF2鼓励程序员创建可在其他应用程序中重用的小模块,并且在所有情况下我们尽可能地简化和抽象类的结构,项目数据库中的许多表彼此连接通过各种外键,我无法理解如何使用自己的实体文件创建独立模块,同时与项目断开连接而不会导致崩溃。
例如:
我的应用程序运行:
以下是项目Web界面的屏幕截图:
正如您所见,该项目通过嵌入同一项目的各个部分,尽可能地展示法律和秩序情况。最初我想创建一个单独的模块,但我需要你的一些建议。
您建议我采用什么策略来采用大型项目的结构?
答案 0 :(得分:13)
我本人目前正致力于ZF2中的一个大型项目,并认为成功的关键在于采用框架提供的模块化。
我认为有些指示会有所帮助:
创建抽象/基本模块
创建“基础”模块将允许您包含可在任何模块中使用的大多数共享/抽象接口/类。这意味着基本模块是系统中每个其他模块的依赖关系。
模块具有相互依赖性
某些模块虽然是分开的,但取决于其他模块的功能(付款可能需要有关用户的信息)。
您应该仔细考虑这些服务是什么,并确保尽管它们是共享的,但您不会开始在每个模块中引入耦合/代码重复。
我广泛使用forward()
插件,它允许我从另一个插件中调用另一个控制器操作并构建聚合视图,同时仍然将每个模块封装在他们自己的模块中。
有效的服务层
确实是一般的MVC设计原则,但确保您不在控制器内编写业务逻辑,而是使用注入控制器的“服务”类。如果你不这样做,你会很快发现它无法管理。
创建服务工厂
首选混凝土工厂类(实现Zend\ServiceManager\FactoryInterface
的类)与封闭相关联,否则您很快就会发现您需要的工厂数量会膨胀Module.php
而这些工具不能像配置那样缓存 - 意思是绩效打击
ViewPlugins / Controller插件
滥用控制器和查看插件的灵活性。这些是封装和注入其他视图/控制器逻辑的极其强大的方法,无需扩展现有类。
<强>表单强>
表单可能很痛苦,因为有很多依赖项需要满足。我认为创建可直接映射到您的域模型(实体)的可重用字段集至关重要。然后将所有输入过滤器/水合器附加到此字段集,如果您希望使用它们,您只需将其附加到表单即可。
例如,如果您有CompanyFieldset
,则可以在CompanyEditForm
和CompanyCreateForm
以及CompanyEditForm
class CompanyCreate extends EntityForm
{
public function init()
{
$this->add(array(
'name' => 'company',
'type' => 'Company\Form\CompanyFieldset', // <-- reused!!
'options' => array(
'use_as_base_fieldset' => true
)
));
// Only the button differs between forms!
$this->add(array(
'name' => 'submit',
'priority' => -100,
'options' => array(
'skipLabel' => true,
),
'attributes' => array(
'type' => 'submit',
'class' => 'btn',
'value' => 'Create'
)
));
}
}
我的项目中的一个例子:
{{1}}
就您的模块而言:
我的应用程序运行:客户,订单,发票,付款,消息,私人备注
这似乎是一个很好的自包含模块列表。
我确信还有更多,如果我能想到什么,我会更新
答案 1 :(得分:3)
模块可以很多。他们几乎什么都没有。这就是他们的魅力。尽量不要过于复杂。想象一下NewsModule
和CategoriesModule
。考虑将这两者粘合在一起。如果你能做到这一点,那么像你这样的大项目就会如此简单。如果你无法管理它,最好建议你等到开始你的新项目,直到你能够这样做。
最终,大项目总是一团糟。从某种意义上来说,当你看到你编写的第一行代码时,你会感到震惊,一年或两年后你会感到震惊。重构代码段的能力非常重要,这正是为什么你应该尽可能地分离每个模块的关注点。
首先,您的“我的应用程序运行”-List似乎是独立模块的良好第一次分离。诀窍是保持接口简单,以便适配器可以轻松互换(客户&lt; - &gt; Orders)。