walnut / lib_actionbus
该包的最新版本(dev-main)没有可用的许可证信息。
dev-main
2022-05-13 22:33 UTC
Requires
- psr/container: ^2.0.1
Requires (Dev)
- phpunit/phpunit: ^9.5.20
- vimeo/psalm: ^4.23.0
This package is not auto-updated.
Last update: 2024-09-26 09:48:27 UTC
README
这是一个可以用作命令总线、查询总线或任何其他总线类型的库。
示例
以下示例中使用了以下类
- 添加产品
/** * @implements Action<bool> */ final class AddProductAction implements Action { public function __construct( public /*readonly*/ string $productId, public /*readonly*/ int $amount ) {} } /** * @implements ActionHandler<bool, AddProductAction> */ final class AddProductActionHandler implements ActionHandler { /** * @param AddProductAction $action * @return bool */ public function execute(Action $action): bool { return true; //@TODO - implement } }
- 检索产品
final class ProductData { public function __construct( public /*readonly*/ string $productId, public /*readonly*/ string $productName, public /*readonly*/ int $amount ) {} } /** * @implements Action<ProductData> */ final class GetProductAction implements Action { public function __construct( public /*readonly*/ string $productId ) {} } /** * @implements ActionHandler<ProductData, GetProductAction> */ final class GetProductActionHandler implements ActionHandler { /** * @param GetProductAction $action * @return bool */ public function execute(Action $action): ProductData { return new ProductData('p1', 'Test Product', 10); //@TODO - implement } }
基本示例(显式映射)
use Walnut\Lib\ActionBus\ActionBus; use Walnut\Lib\ActionBus\Handler\DefaultActionHandler; use Walnut\Lib\ActionBus\Handler\Mapper\ArrayActionHandlerMapper; use Walnut\Lib\ActionBus\Handler\Loader\ContainerActionHandlerLoader; $defaultActionHandler = new DefaultActionHandler( new ArrayActionHandlerMapper([ AddProductAction::class => AddProductActionHandler::class, GetProductAction::class => GetProductActionHandler::class, ]), new ContainerActionHandlerLoader(getPsrContainer()) ); $actionBus = new ActionBus($defaultActionHandler); $result = $actionBus->execute(new AddProductAction('p2', 5)); $productName = $actionBus->execute(new GetProductAction('p2'))->productName;
基本示例(隐式映射)
use Walnut\Lib\ActionBus\ActionBus; use Walnut\Lib\ActionBus\Handler\DefaultActionHandler; use Walnut\Lib\ActionBus\Handler\Mapper\NameActionHandlerMapper; use Walnut\Lib\ActionBus\Handler\Loader\ContainerActionHandlerLoader; $defaultActionHandler = new DefaultActionHandler( new NameActionHandlerMapper(), new ContainerActionHandlerLoader(getPsrContainer()) ); $actionBus = new ActionBus($defaultActionHandler); $result = $actionBus->execute(new AddProductAction('p2', 5)); $productName = $actionBus->execute(new GetProductAction('p2'))->productName;
使用中间件
use Walnut\Lib\ActionBus\Handler\DefaultActionHandler; use Walnut\Lib\ActionBus\Handler\Mapper\NameActionHandlerMapper; use Walnut\Lib\ActionBus\Handler\Loader\ContainerActionHandlerLoader; $defaultActionHandler = new DefaultActionHandler( new NameActionHandlerMapper(), new ContainerActionHandlerLoader(getPsrContainer()) ); final class TransactionMiddleware implements ActionHandlerMiddleware { public function __construct( private /*readonly*/ TransactionContext $transactionContext ) {} /** * @throws Exception */ public function process(Action $action, ActionHandler $actionHandler): mixed { try { $result = $actionHandler->execute($action); $this->transactionContext->saveChanges(); return $result; } catch (Exception $e) { $this->transactionContext->revertChanges(); throw $e; } } } final class ErrorLoggerMiddleware implements ActionHandlerMiddleware { public function __construct( private /*readonly*/ LoggerInterface $logger ) {} /** * @throws Throwable */ public function process(Action $action, ActionHandler $actionHandler): mixed { try { return $actionHandler->execute($action); } catch (Throwable $e) { $this->logger->error($e); throw $e; } } } $actionBus = new ActionBus($defaultActionHandler, [ new TransactionMiddleware(getTransactionContext()), new ErrorLoggerMiddleware(getPsrLogger()) ]); $result = $actionBus->execute(new AddProductAction('p2', 5));