如何开始一个新的大型ZF2项目?

时间:2014-01-23 07:37:19

标签: php doctrine-orm zend-framework2

我打算用ZF2创建一个新项目。事实上,我必须升级ZF1项目,但我决定从头开始。

我的项目非常庞大,已经被来自世界各地的志愿者翻译成10种不同的语言。

我遇到的困难是对ZF2告诉我遵循的模块结构的分析。

该软件允许ISP领域的中小企业管理其客户数据库,服务,订单,发票,域名,技术支持,电子商务,kb等等。

假设ZF2鼓励程序员创建可在其他应用程序中重用的小模块,并且在所有情况下我们尽可能地简化和抽象类的结构,项目数据库中的许多表彼此连接通过各种外键,我无法理解如何使用自己的实体文件创建独立模块,同时与项目断开连接而不会导致崩溃。

例如:

我的应用程序运行:

  • 客户
  • 订单
  • 发票
  • 付款
  • 消息
  • 私人笔记

以下是项目Web界面的屏幕截图: ShineISP Orders Management

正如您所见,该项目通过嵌入同一项目的各个部分,尽可能地展示法律和秩序情况。最初我想创建一个单独的模块,但我需要你的一些建议。

您建议我采用什么策略来采用大型项目​​的结构?

2 个答案:

答案 0 :(得分:13)

我本人目前正致力于ZF2中的一个大型项目,并认为成功的关键在于采用框架提供的模块化。

我认为有些指示会有所帮助:

  • 创建抽象/基本模块

    创建“基础”模块将允许您包含可在任何模块中使用的大多数共享/抽象接口/类。这意味着基本模块是系统中每个其他模块的依赖关系。

  • 模块具有相互依赖性

    某些模块虽然是分开的,但取决于其他模块的功能(付款可能需要有关用户的信息)。

    您应该仔细考虑这些服务是什么,并确保尽管它们是共享的,但您不会开始在每个模块中引入耦合/代码重复。

    我广泛使用forward()插件,它允许我从另一个插件中调用另一个控制器操作并构建聚合视图,同时仍然将每个模块封装在他们自己的模块中。

  • 有效的服务层

    确实是一般的MVC设计原则,但确保您不在控制器内编写业务逻辑,而是使用注入控制器的“服务”类。如果你不这样做,你会很快发现它无法管理。

  • 创建服务工厂

    首选混凝土工厂类(实现Zend\ServiceManager\FactoryInterface的类)与封闭相关联,否则您很快就会发现您需要的工厂数量会膨胀Module.php而这些工具不能像配置那样缓存 - 意思是绩效打击

  • ViewPlugins / Controller插件

    滥用控制器和查看插件的灵活性。这些是封装和注入其他视图/控制器逻辑的极其强大的方法,无需扩展现有类。

  • <强>表单

    表单可能很痛苦,因为有很多依赖项需要满足。我认为创建可直接映射到您的域模型(实体)的可重用字段集至关重要。然后将所有输入过滤器/水合器附加到此字段集,如果您希望使用它们,您只需将其附加到表单即可。

    例如,如果您有CompanyFieldset,则可以在CompanyEditFormCompanyCreateForm以及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)

模块可以很多。他们几乎什么都没有。这就是他们的魅力。尽量不要过于复杂。想象一下NewsModuleCategoriesModule。考虑将这两者粘合在一起。如果你能做到这一点,那么像你这样的大项目就会如此简单。如果你无法管理它,最好建议你等到开始你的新项目,直到你能够这样做。

最终,大项目总是一团糟。从某种意义上来说,当你看到你编写的第一行代码时,你会感到震惊,一年或两年后你会感到震惊。重构代码段的能力非常重要,这正是为什么你应该尽可能地分离每个模块的关注点。

首先,您的“我的应用程序运行”-List似乎是独立模块的良好第一次分离。诀窍是保持接口简单,以便适配器可以轻松互换(客户&lt; - &gt; Orders)。