php-commons/cqrs-bus

CQRS Bus 是一个适用于 Symfony 4.3+ 的 Bundle,它使用 Symfony Messanger 实现 Command Bus 和 QueryBus

安装次数: 80

依赖项: 0

建议者: 0

安全: 0

星标: 0

关注者: 2

分支: 0

公开问题: 3

类型:symfony-bundle

1.0.0 2019-11-05 06:22 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());
    }
}