Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.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 若命令(CQR)是UI的动作,那个么它们是否属于表示层?_Php_Cqrs_Domain Driven Design - Fatal编程技术网

Php 若命令(CQR)是UI的动作,那个么它们是否属于表示层?

Php 若命令(CQR)是UI的动作,那个么它们是否属于表示层?,php,cqrs,domain-driven-design,Php,Cqrs,Domain Driven Design,我应该在控制器中注入命令和事件总线,还是应该在控制器中注入域服务,让域服务创建命令并分派到命令总线 例如: // CreateUserController.php public function __construct (CreateUserCommand $command, CommandBus $cm) { ... } public function createAction(Request $request) { // data validation $this-

我应该在控制器中注入命令和事件总线,还是应该在控制器中注入域服务,让域服务创建命令并分派到命令总线

例如:

// CreateUserController.php

public function __construct (CreateUserCommand $command, CommandBus $cm) {
   ...
}

public function createAction(Request $request) {
    // data validation
    $this->command->setData($request->getData());
    try {
        $this->cm->handle($this->command)
    } catch (Exception $e) {
        return new Response(500)     // assume Response accepts http code
    }
    return new Response(200);
}
还是让它调用域服务更好

//CreateUserController.php

public function __construct (UserService $userService) {
   ...
}

public function createAction(Request $request) {
    // data validation
    $name = $request->getData()['name'];
    $lastname = $request->getData()['lastname'];

    try {
        $this->userService->createUser($name, $lastname)();
    } catch (Exception $e) {
        return new Response(500)     // assume Response accepts http code
    }
    return new Response(200);
}
这似乎更好,因为控制器没有责任填充命令并调用命令处理程序,它只是通过表单验证所需输入是否存在,然后调用域服务层

但是,如果命令属于表示层,则工作流将是:


表示层请求->域服务->表示层命令和命令处理程序->域->表示层响应。当Eric Evans最初在中描述DDD时,他使用的是三层体系结构:应用程序/域/持久性

一个关键的抽象是应用程序和域之间的接缝,称为存储库。在该边界处,交互通常看起来像

$user = repository->getById($id)
$user->create($name, $lastName)
repository->save($user)
请注意,所有实际的域逻辑都隐藏在$user后面

如果您想获取该代码块,并将其包装到服务中,这很好。但它通常会被视为应用程序服务,而不是域服务。见霍利科夫,了解一个或多个


您可能需要考虑一件事:命令,如http请求,基本上是消息。在应用程序的生命周期中,这些消息的定义可能会更改。您需要考虑的是需要将代码更改到多少不同的位置。

我们不知道。我们对您的项目有一个非常小的快照,当然不足以做出比您更好的决策。所以,我投票决定以主要基于意见的方式结束。我在域/服务下的域服务UserService中添加了这些内容,其中包括AddNew name、lastname、email等方法。UserService构造函数接收CommandBus。AddNew方法创建一个作为DTO的Domain\Commands\User\CreateCommand,并将其传递给CommandBus->handle。然后Infrastructure\CommandHandler\User\DoctrineCreateHandler在构造函数中接收一个条令\ORM\EntityManager,handle方法使用EntityManager进行持久化和刷新操作。