php-commons / cqrs-bus
CQRS Bus 是一个适用于 Symfony 4.3+ 的 Bundle,它使用 Symfony Messanger 实现 Command Bus 和 QueryBus
1.0.0
2019-11-05 06:22 UTC
Requires
- symfony/config: ^4.3
- symfony/dependency-injection: ^4.3
- symfony/flex: ^1.4
- symfony/framework-bundle: ^4.3
- symfony/http-kernel: ^4.3
- symfony/messenger: ^4.3
- symfony/yaml: ^4.3
Requires (Dev)
- phpunit/phpunit: ^8.4
This package is not auto-updated.
Last update: 2024-10-02 09:29:13 UTC
README
CQRS Bus 是一个适用于 Symfony 4.3+ 的 Bundle,它使用 Symfony Messanger 实现 Command Bus 和 QueryBus
安装
composer require php-commons/cqrs-bus
配置
config/services.yaml
CommandBus
处理器配置
services: App\CommandHandler\MyOwnCommandHandler: autoconfigure: false tags: - { name: messenger.message_handler, bus: command.bus } ... App\CommandHandler\MyCustomCommandHandler: autoconfigure: false tags: - { name: messenger.message_handler, bus: command.bus } ...
或
command_handlers: namespace: App\CommandHandler\ resource: '%kernel.project_dir%/src/CommandHandler/*CommandHandler.php' autoconfigure: false tags: - { name: messenger.message_handler, bus: command.bus }
非常重要,需要为您的所有命令处理器添加标签: { name: messenger.message_handler, bus: command.bus },否则其他 MessageHandler 可能会处理查询。非常重要,需要从: PhpCommons\CQRSBus\Handlers\Command\AbstractCommandHandler 继承所有您的命令处理器,否则 CommandHandler 将找不到它。
QueryBus
处理器配置
您需要在 /config/services.yml 中配置处理器
App\Query\MyOwnQueryHandler: autoconfigure: false tags: - { name: messenger.message_handler, bus: query.bus }
或
query_handlers: namespace: App\MessageHandler\ resource: '%kernel.project_dir%/src/MessageHandler/*QueryHandler.php' autoconfigure: false tags: - { name: messenger.message_handler, bus: query.bus }
非常重要,需要为您的所有查询处理器添加标签: { name: messenger.message_handler, bus: query.bus },否则其他 MessageHandler 可能会处理查询。非常重要,需要从: PhpCommons\CQRSBus\Handlers\Query\AbstractQueryHandler 继承所有您的查询处理器,否则 QueryHandler 将找不到它。
用法
CommandBus
<?php declare(strict_types=1); namespace App\Controller; use PhpCommons\CQRSBus\Bus\Command\CommandBus; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Routing\Annotation\Route; class DefaultController extends AbstractController { /** * @var CommandBus */ private $commandBus; public function __construct(CommandBus $commandBus) { $this->commandBus = $commandBus; } /** * @Route("/", name="homepage") */ public function index() { $this->commandBus->handle(new TestCommand('test_message')); } }
命令
<?php declare(strict_types=1); namespace App\Command; use PhpCommons\CQRSBus\Application\Command\CommandInterface; class TestCommand implements CommandInterface { /** * @var string */ private $message; public function __construct(string $message) { $this->message = $message; } /** * @return string */ public function getMessage(): string { return $this->message; } }
命令处理器
<?php declare(strict_types=1); namespace App\Command; use App\Repositories\UserRepository; use PhpCommons\CQRSBus\Application\Command\CommandInterface; use PhpCommons\CQRSBus\Handlers\Command\AbstractCommandHandler; class TestCommandHandler extends AbstractCommandHandler { /** * @var UserRepository */ private $userRepository; public function __construct(UserRepository $userRepository) { $this->userRepository = $userRepository; } /** * @param CommandInterface|TestCommand $command */ public function handle(CommandInterface $command): void { $this->userRepository->save($command->getMessage()); } }
QueryBus
<?php declare(strict_types=1); namespace App\Controller; use App\Query\TestQuery; use PhpCommons\CQRSBus\QueryBus\QueryBus; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Routing\Annotation\Route; /** * @Route("/tests") */ class UsersController extends AbstractController { /** * @var QueryBus */ private $queryBus; public function __construct(QueryBus $queryBus) { $this->queryBus = $queryBus; } /** * @Route("/{id}", name="get_test") */ public function getTest(int $id) { // GetUserByIdQuery(1) $testQueryResult = $this->queryBus->handle(new TestQuery(1)); } }
查询
<?php declare(strict_types=1); namespace App\Query; use PhpCommons\CQRSBus\QueryBus\AbstractQuery; class TestQuery extends AbstractQuery { /** * @var int */ private $id; public function __construct(int $id) { $this->id = $id; } /** * @return int */ public function getId(): int { return $this->id; } }
查询处理器
<?php declare(strict_types=1); namespace App\Query; use PhpCommons\CQRSBus\Application\Query\QueryInterface; use PhpCommons\CQRSBus\Handlers\Query\AbstractQueryHandler; class TestQueryHandler extends AbstractQueryHandler { /** * @var TestRepository */ private $testRepository; public function __construct(TestRepository $testRepository) { $this->testRepository = $testRepository; } /** * @param QueryInterface|TestQuery $query */ public function handle(QueryInterface $query): object { return $this->testRepository->findById($query->getId()); } }