mcustiel / 104
此包已被弃用且不再维护。未建议替代包。
实现 CommandBus 和 QueryBus 的简单辅助工具
v1.0
2018-12-18 16:08 UTC
Requires
- php: >=7.2
- psr/container: ^1.0
Requires (Dev)
- phpunit/phpunit: ^7.0
This package is auto-updated.
Last update: 2023-07-19 07:15:34 UTC
README
简单实现 CommandBus 和 QueryBus,只需直接使用。
CommandBus 和 QueryBus 的使用非常相似。主要区别是命令不返回值,而查询返回一个可选值。
示例
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(); } }