Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 编程到接口和观察者模式_Php_Oop_Design Patterns_Architecture_Domain Driven Design - Fatal编程技术网

Php 编程到接口和观察者模式

Php 编程到接口和观察者模式,php,oop,design-patterns,architecture,domain-driven-design,Php,Oop,Design Patterns,Architecture,Domain Driven Design,首先是一个小的介绍,帮助您理解我的来历:我不知道如何命名这个问题,或者像它一样,或者像存储库一样跟踪工作单元的更改 我有两个接口,ChangeListener和ChangeSubject,它们是耦合的: interface ChangeListener { public function onSubjectChanged(ChangeSubject $subject, array $data); } interface ChangeSubject { public functio

首先是一个小的介绍,帮助您理解我的来历:我不知道如何命名这个问题,或者像它一样,或者像存储库一样跟踪工作单元的更改

我有两个接口,
ChangeListener
ChangeSubject
,它们是耦合的:

interface ChangeListener
{
    public function onSubjectChanged(ChangeSubject $subject, array $data);
}
interface ChangeSubject
{
    public function addChangeListener(ChangeListener $listener);
}
我还有一个存储库和一个工作单元(WIP,我将省略一些部分):

现在,在我对
UnitOfWork
的实现中,让我们称之为
Book
,更准确地说,在方法
hydrateChange
中,我将更改通知存储库,这很容易:

$repository->onSubjectChanged($this, $newHydration);
现在的问题是,在存储库中,我需要知道书的id。但是存储库的处理方法接收到一个
ChangeSubject
,它没有id(书的
有id)

如何正确设计这样一个系统

如果PHP有泛型,这是可能的。一个我不喜欢的黑客解决方案是使用
instanceof


您误解了其中一些概念。如果你做到了以下几点,你应该回到正轨:

  • 不要在域对象中实现工作单元。工作单元只是跟踪更改的技术助手。因此,工作单元引用业务对象,例如,要注意“ID为32的图书已更改”,但它与业务对象不同

  • 为聚合类型创建具体的存储库。一个
    BookRepository
    应该包含
    GetById(BookId)
    GetByAuthor(Author)
    等方法。注意:在使用泛型的语言中,可能有机会提取泛型部分,但在PHP中,最好使用具体的聚合类型,如
    Book


我建议您进一步了解工作单元和存储库模式。在尝试使用它们之前,请确保您完全理解它们。还要确保您了解不同的存储库变体(例如,命令式存储库与集合式存储库),以便为您的项目做出明智的决策。

您误解了一些概念。如果你做到了以下几点,你应该回到正轨:

  • 不要在域对象中实现工作单元。工作单元只是跟踪更改的技术助手。因此,工作单元引用业务对象,例如,要注意“ID为32的图书已更改”,但它与业务对象不同

  • 为聚合类型创建具体的存储库。一个
    BookRepository
    应该包含
    GetById(BookId)
    GetByAuthor(Author)
    等方法。注意:在使用泛型的语言中,可能有机会提取泛型部分,但在PHP中,最好使用具体的聚合类型,如
    Book


我建议您进一步了解工作单元和存储库模式。在尝试使用它们之前,请确保您完全理解它们。还要确保您了解不同的存储库变体(例如,命令样式存储库与集合样式存储库),以便为您的项目做出明智的决策。

在这种情况下,您将在某个地方使用
instanceof
。为什么要将UnitOfWork和业务对象结合起来?业务对象不应该意识到与持久性相关的问题。@SebastianKeßler您在哪里看到业务对象和持久性之间的依赖关系?它是依赖项反转,持久性作为一个ChangeListener从外部注入,但也可能有其他的,比如跟踪谁做了什么的安全服务(安全方面的会计)<如果PHP支持泛型,则不需要使用code>instanceof
。很难理解这与DDD有什么关系…@AlexeyZimarev问题还被标记为
设计模式
oop
。我标记了它
ddd
,因为所涉及的类也是一个UOW和一个存储库。这意味着使用PHP进行DDD的人可能会遇到这种情况。当然,DDD不仅仅是在这种情况下说明的,它是无处不在的语言,它是有界的上下文,等等。你误解了什么是工作单元。UoW是一组更改,其中应存储所有内容或任何内容。在DB世界中,它可以由事务表示。在这个场景中,您将在某处使用
instanceof
。为什么要将UnitOfWork和业务对象结合起来?业务对象不应该意识到与持久性相关的问题。@SebastianKeßler您在哪里看到业务对象和持久性之间的依赖关系?它是依赖项反转,持久性作为一个ChangeListener从外部注入,但也可能有其他的,比如跟踪谁做了什么的安全服务(安全方面的会计)<如果PHP支持泛型,则不需要使用code>instanceof。很难理解这与DDD有什么关系…@AlexeyZimarev问题还被标记为
设计模式
oop
。我标记了它
ddd
,因为所涉及的类也是一个UOW和一个存储库。这意味着使用PHP进行DDD的人可能会遇到这种情况。当然,DDD不仅仅是在这种情况下说明的,它是无处不在的语言,它是有界的上下文,等等。你误解了什么是工作单元。UoW是一组更改,其中应存储所有内容或任何内容。在DB世界中,它可以由事务表示。是的,关于你的第一个要点:我确实把它们混在一起了。关于第二个:是的,我在图书库中有这些方法。对我来说,准确跟踪哪本书的哪些字段被修改是非常重要的
$repository->onSubjectChanged($this, $newHydration);