smoothcodes/smooth-query-bus

dev-master 2020-04-29 12:53 UTC

This package is auto-updated.

Last update: 2024-09-29 05:42:39 UTC


README

此简单包将帮助您在项目中实现CQRS的查询部分。易于与Laravel、Symfony或原生PHP项目集成。

安装

$ composer require smoothcodes/smooth-query-bus

使用方法

此包使用Psr\ContainerInterface来解决注入到查询处理器的依赖项。由于Symfony和Laravel依赖容器实现了ContainerInterface,因此在您的Symfony/Laravel项目中实现SmoothQueryBus非常容易。

默认情况下,此包提供了名为SmoothCodes\SmoothQueryBus\SmoothHandlerResolver的处理器解析器,它需要类似以下的项目结构和查询及处理器

app
│   ...    
│
└───Query
│   │   GetUserByIdQuery.php
│   │   ...
│   
└───Handler
    │   GetUserByIdQueryHandler.php
    |   ...

每个Query都应该实现SmoothCodes\SmoothQueryBus\QueryInterface,每个Handler都应该实现SmoothCodes\SmoothQueryBus\QueryHandlerInterface

现在您可以像这样分发您的查询

在处理器中,__invoke方法被调用为操作。因此,处理器应该看起来像这样

class GetUserByIdQueryHandler implements HandlerInterface {
    protected $userRepository;

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

    public function __invoke(GetUserByIdQuery $query) {
        return $this->userRepository->find($query->id);
}
$queryBus = new SmoothQueryBus(
    new SmoothHandlerResolver($container)
);

$result = $queryBus->query(new GetUserByIdQuery($id));

如果您想,您可以实现自己的查询处理器解析策略,通过向SmoothHandlerResolver实例提供实现SmoothCodes\SmoothQueryBus\HandlerResolvingStrategy的类,例如像这样

        $namingResolver = new class($queryHandler) implements HandlerResolvingStrategy {
            private $queryHandler;

            public function __construct(QueryHandlerInterface $handler)
            {
                $this->queryHandler = $handler;
            }

            public function getHandlerClassName(QueryInterface $query)
            {
                return get_class($this->queryHandler);
            }
        };

        $queryBus = new SmoothQueryBus(
            new SmoothHandlerResolver($container, $namingResolver)
        );

将使用默认的处理器解析策略。

这是一个非常简单的包,可以完全自定义。报告任何问题,提供反馈或提出一些功能请求。