mcustiel/

104

此包已被弃用且不再维护。未建议替代包。

实现 CommandBus 和 QueryBus 的简单辅助工具

v1.0 2018-12-18 16:08 UTC

This package is auto-updated.

Last update: 2023-07-19 07:15:34 UTC


README

简单实现 CommandBus 和 QueryBus,只需直接使用。

CommandBus 和 QueryBus 的使用非常相似。主要区别是命令不返回值,而查询返回一个可选值。

Build Status Scrutinizer Code Quality Code Coverage

Cutcsa 104 paso carrasco

示例

Symfony 中的使用

首先,您需要将您的命令处理程序和查询处理程序添加到实现 PSR-11 的容器中。此容器必须注入到 CommandHandlerLocator 和/或 QueryHandlerLocator。

准备查询(或命令)并通过适当的总线发送。

<?php
// UserController.php
class UsersController extends Controller
{
    /** @var QueryBus */
    private $queryBus;
    
    public function __construct(QueryBus $queryBus)
    {
        $this->queryBus = $queryBus;
    }
    
    /**
     * @Route("/user/{id}", name="user_data", methods={"GET"})
     */
    public function getUserData($id): Response
    {
        try {
            $userId = new UserId($id);
            $result = $this->queryBus->dispatch(new GetUserDataQuery($userId));

            if ($result->isPresent()) {
                $user = $result->getResult();
                $userSettings = $user->getSettings();

                return new JsonResponse($user);
            }

            return new JsonREsponse(
                ['message' => 'error.userNotFound'],
                JsonResponse::HTTP_NOT_FOUND
            );
        } catch (\Exception $e) {
            return new JsonResponse(
                ['message' => 'error.unexpected ' . $e->__toString()],
                JsonResponse::HTTP_INTERNAL_SERVER_ERROR
            );
        }
    }

这是查询的外观,它需要实现 query。

<?php
// GetUserDataQuery.php

class GetUserDataQuery implements Query
{
    /** @var UserId */
    private $userId;

    public function __construct(UserId $userId)
    {
        $this->userId = $userId;
    }

    public function getUserId(): UserId
    {
        return $this->userId;
    }

    public function getQueryHandler(): HandlerIdentifier
    {
        // The identifier is a string with the key of the object in the container.
        return new HandlerIdentifier(GetUserDataQueryHandler::class);
    }
}

处理程序类中包含所有检索查询值或执行命令的逻辑。

<?php
// GetUserDataQueryHandler.php
class GetUserDataQueryHandler implements QueryHandler
{    
    /** @var UserRepository */
    private $userRepository;

    public function __construct(UserRepository $userRepository)
    {
        $this->userRepository = $userRepository;
    }

    public function handle(Query $query): OptionalResult
    {
        // Do all the magic needed to get the user from repository here
        return new GetUserDataQueryOptionalResult($user);
    }
}

可选结果是一种管理可能返回 null 或值查询的方法。对于命令来说,这不是必需的,因为它们返回 void。

<?php
// GetUserDataQueryOptionalResult.php
class GetUserDataQueryOptionalResult extends OptionalResult
{
    public function __construct(?User $result = null)
    {
        parent::__construct($result);
    }

    public function getResult(): User
    {
        return parent::getResult();
    }
}