Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.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
CQRS+;PHP:事件发生时将逻辑放置在何处_Php_Database_Events_Domain Driven Design_Cqrs - Fatal编程技术网

CQRS+;PHP:事件发生时将逻辑放置在何处

CQRS+;PHP:事件发生时将逻辑放置在何处,php,database,events,domain-driven-design,cqrs,Php,Database,Events,Domain Driven Design,Cqrs,目前,我正在用CQRS、ES和DDD的思想构建一个PHP应用程序。让我们考虑一个5个问题的调查应用。参与者可以通过回答这5个问题来回答调查 这5个问题可以按正确的顺序从阅读端查询。但是,一个问题可以有条件。例如,当B回答问题1时,不要显示问题2。答案是1B,下一个问题是:3、4和5 客户端可以启动命令AnswerQuestion,处理程序将处理该命令,并启动事件questionresponsed。基于该事件,事件处理程序将更新读取端,客户端可以查询下一个要询问的问题。如果没有进一步的问题,参与者

目前,我正在用CQRS、ES和DDD的思想构建一个PHP应用程序。让我们考虑一个5个问题的调查应用。参与者可以通过回答这5个问题来回答调查

这5个问题可以按正确的顺序从阅读端查询。但是,一个问题可以有条件。例如,当B回答问题1时,不要显示问题2。答案是1B,下一个问题是:3、4和5

客户端可以启动命令AnswerQuestion,处理程序将处理该命令,并启动事件questionresponsed。基于该事件,事件处理程序将更新读取端,客户端可以查询下一个要询问的问题。如果没有进一步的问题,参与者将完成参与(并可以参加新的参与)

根据给定的答案,调查中的逻辑将决定要问哪些问题,哪些问题不是,这是纯领域逻辑我正在努力将此逻辑放置/应用于何处。此外,参与何时完成,在何处决定。我认为最可能的答案是:让调查人员根据参与人员给出的答案确定下一个问题。或者,在服务中共享逻辑,让阅读端查询问题和给出的答案,并将共享逻辑应用于该服务


你能帮我进一步吗?提前谢谢

据我所知,您这里有几个领域概念(请原谅术语,请与领域专家交谈以完善它们):

  • 问题(被问的问题)关系(问题之间)
  • 调查(AR),由多个问题组成,包括
  • 关系映射)
  • 提交的调查
当问题被回答时,你也有一些事件

在放置逻辑方面,我将执行以下操作:

应用程序服务将为表示层构建所有必需的部分(假设这是通过Web API调用实现的)

在应用程序服务上,我将添加整个请求的调查(按调查名称从存储库中获取),并将其传递给客户机

客户机将处理关系的映射,并且可能会根据当前选择通过Angular或Knockout显示当前可用的问题

如果您不想在客户端上存储状态,我会根据当前选择获取所有可用选项的列表(每次客户端发生更改时,您都会请求此可用选项的新列表)

何时决定调查完成:

客户机上的某些状态可能知道何时完成此操作(它将知道何时所有可用问题都已回答)

在服务器上进行处理时,您需要通过构建域对象并确认调查已完成来验证这一点,如果已完成,则需要存储提交的调查

几点:

我真的不知道事件源或CQR是如何解决问题的,或者这是为了学习目的

您可能希望通过暂时忘记读取模型来简化它,而只是从存储库中水合调查(您如何做到这一点,无论是通过事件存储、ORM还是读取模型都无关紧要)——读取模型用于构建客户端需要的视图,因为查询事件流意味着重播所有事件(geteventstore.com有一种称为projections的东西,可以动态构建这些视图)


事件来源可以极大地帮助您了解业务,我认为在本例中,将选定的问题存储为一系列事件,您可以了解人们的反应速度、他们改变主意的次数等。

如果您能告诉我是否需要扩展我回答的任何方面,或者答案不是你要找的,而是考虑创造一个赏金来吸引注意力。谢谢!错过了这个帖子,抱歉。这是一个真正的应用,而不仅仅是学习的目的。使用CQRS的全部想法是你可以得到的统计数据,就像你在最后一段中所说的。你已经为我做了一些更清楚的事情。我想我会的。在阅读端存储所有给定的答案以及下一个问题(目前还没有答案)。客户端可以浏览已回答的问题并获取最后一个要询问的问题。当域决定所有需要的问题都已回答时,将在阅读端设置一个标志。