spiral-packages / cqrs
支持CQRS的Spiral框架轻量级消息总线
v2.3.0
2023-11-30 08:33 UTC
Requires
- php: ^8.1
- spiral/attributes: ^3.0
- spiral/boot: ^3.0
- spiral/config: ^3.0
- spiral/console: ^3.0
- spiral/core: ^3.0
- spiral/tokenizer: ^3.0
- symfony/messenger: ^6.0
Requires (Dev)
- spiral/framework: ^3.0
- spiral/testing: ^2.0
- vimeo/psalm: ^4.9
This package is auto-updated.
Last update: 2024-09-07 23:14:16 UTC
README
这是一个轻量级消息外观。它允许您通过消息来定义模型API。
- 命令消息描述模型可以处理的操作。
- 查询消息描述可以从您的(读取)模型获取的信息。
需求
确保您的服务器配置了以下PHP版本和扩展
- PHP 8.1+
- Spiral框架 3.0+
安装
您可以通过composer安装此包。
composer require spiral-packages/cqrs
包安装后,您需要从包中注册引导加载器。
protected const LOAD = [ // ... \Spiral\Cqrs\Bootloader\CqrsBootloader::class, ];
注意:如果您使用
spiral-packages/discoverer
,则无需自行注册引导加载器。
使用方法
您还可以通过属性注册命令和查询处理器
命令
命令定义
class StoreUser implements \Spiral\Cqrs\CommandInterface { public function __construct( public Uuid $uuid, public string $username, public string $password, public \DateTimeImmutable $registeredAt, ) { } }
命令处理器定义
要注册命令处理器,只需在应该被调用的方法上添加属性即可。
class StoreUserHandler { public function __construct( private EntityManagerInterface $entityManager ) { } #[\Spiral\Cqrs\Attribute\CommandHandler] public function __invoke(StoreUser $command) { $this->entityManager->persist( new User( $command->uuid, $command->username, $command->password, $command->registeredAt ) ); $this->entityManager->run(); } }
分发命令
use Ramsey\Uuid\Uuid; class UserController { public function store(UserStoreRequest $request, \Spiral\Cqrs\CommandBusInterface $bus) { $bus->dispatch(new StoreUser( $uuid = Uuid::uuid4(), $request->getUsername(), $request->getPassword(), new \DateTimeImmutable() )); return $uuid; } }
查询
查询定义
class FindAllUsers implements \Spiral\Cqrs\QueryInterface { public function __construct( public array $roles = [] ) { } }
class FindUserById implements \Spiral\Cqrs\QueryInterface { public function __construct( public Uuid $uuid ) { } }
查询处理器定义
class UsersQueries { public function __construct( private UserRepository $users ) { } #[\Spiral\Cqrs\Attribute\QueryHandler] public function findAll(FindAllUsers $query): UserCollection { $scope = []; if ($query->roles !== []) { $scope['roles'] = $query->roles } return new UserCollection( $this->users->findAll($scope) ); } #[\Spiral\Cqrs\Attribute\QueryHandler] public function findById(FindUserById $query): UserResource { return new UserResource( $this->users->findByPK($query->uuid) ); } }
分发查询
use Ramsey\Uuid\Uuid; class UserController { public function index(UserFilters $filters, \Spiral\Cqrs\QueryBusInterface $bus) { return $bus->ask( new FindAllUsers($filters->roles()) )->toArray(); } public function show(string $uuid, \Spiral\Cqrs\QueryBusInterface $bus) { return $bus->ask( new FindUserById(Uuid::fromString($uuid)) )->toArray(); } }
测试
composer test
许可证
MIT许可证(MIT)。请参阅许可证文件以获取更多信息。