smoothcodes / smooth-query-bus
dev-master
2020-04-29 12:53 UTC
Requires
- php: >=7.0
- psr/container: ^1.0
Requires (Dev)
- phpunit/phpunit: ^9.1
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) );
将使用默认的处理器解析策略。
这是一个非常简单的包,可以完全自定义。报告任何问题,提供反馈或提出一些功能请求。