【发布时间】:2012-11-12 17:16:48
【问题描述】:
一个 ZF2 系统中有许多组件。每个组件都有自己的表示层、业务层和数据层。问题是当组件 Foo 有一个使用组件 Bar 的数据层的控制器时。
示例:
<inside modules, each module can be individually deployed or removed>
\modules
\Foo ; one module (this directory) can be added or removed
\view ; presentation layer (view) for all subcomponents
\Subcomponent1
\Action1
\Subcomponent2
\Action2
...
\src
\Subcomponent1
\Entity ; data layer (model)
\Controller ; business layer (controller)
\Service ; service layer (service)
\Subcomponent2
\Entity
\Controller
\Service
\Subcomponent3
...
\Bar
\view
...
\src
\Subcomponent1
...
\Baz
\src
\Subcomponent1
...
子组件与来自其他子组件的实体强耦合,通常来自完全不同的组件。控制器和服务就是这种情况。可以解决吗?
Foo\Subcomponent1 有一个 FooSub1Service,它使用 Bar\Subcomponent1 中的实体来处理传递的数据并将它们导入 DB。 Baz\Subcomponent1 有一个 AuthenticationService,它使用 Bar\Subcomponent1 实体通过 ID 等查找用户。
我知道依赖注入,但在这种情况下,每个子组件中都有 EntityManager,它被指示按名称和 PK 查找实体,即 find("Bar\Subcomponent1\Entity\User", 123)。而且,当持久化实体时,我必须实例化任何具有外键的东西,即 UserAddress 并将其添加到 User。每次调用 x = new NameOfEntity() 时,我都会将子组件与子组件中的某个实体紧密耦合,通常来自不同的系统模块。
【问题讨论】:
-
如果 ZF2 是面向方面的,我会将这些横切关注点(例如持久性)解耦到方面。麻烦的是,它只是 OOP。模块化的损失是不可避免的吗? en.wikipedia.org/wiki/Cross-cutting_concern
-
如果您遵循工厂模式,您不应该发现模块之间存在依赖关系,并且从架构的角度来看,共享组件可能应该位于所有模块都可以访问的库文件夹中。
标签: php architecture zend-framework2 software-design