命令模式+分页

时间:2018-07-31 07:52:06

标签: php rest symfony cqrs command-pattern

我有一些用于获取对象集合的命令。

<?php

declare(strict_types=1);

namespace App\Domain\Query;

class GetCardsByNetworkId
{
    /**
     * @var int
     */
    private $network_id;

    public function __construct(int $network_id)
    {
        $this->network_id = $network_id;
    }

    public function network_id(): int
    {
        return $this->network_id;
    }
}

但是我需要分页显示结果。

现在,我将分页作为处理方法的参数,如下所示,但我觉得该处理只能有一个参数-Command。

<?php

declare(strict_types=1);

namespace App\Domain\Query;

use App\Projection\Card\CardFinder;

class GetCardsByNetworkIdHandler
{
    /**
     * @var CardFinder
     */
    private $cardFinder;

    public function __construct(CardFinder $cardFinder)
    {
        $this->cardFinder = $cardFinder;
    }

    public function handle(GetCardsByNetworkId $query, int $itemsPerPage, int $page)
    {
        $card = $this->cardFinder->findAllForNetworkId($query->network_id(), $itemsPerPage, $page);

        return $card;
    }
}

问题:

该如何纠正?我应该在命令中放置分页参数吗?

1 个答案:

答案 0 :(得分:2)

您应该在GetCardsByNetworkId构造中询问itemsPerPage和page参数。

在您甚至将GetCardsByNetworkId传递给commandBus之前,这将阻止您的Command处理分页验证(itemPerPage> 0,页面> = 1,...)并验证输入。

您将看到类似这样的内容:

<?php

declare(strict_types=1);

namespace App\Domain\Query;

class GetCardsByNetworkId
{
    /**
     * @var int
     */
    private $network_id;
    /**
     * @var int
     */
    private $itemsPerPage;
    /**
     * @var int
     */
    private $page;


    public function __construct(
        int $network_id,
        int $itemsPerPage,
        int $page
    ) {
        $this->network_id = $network_id;
        IsGreaterThan::validate(0, $itemsPerPage);
        IsGreaterThan::validate(0, $page);
        $this->itemsPerPage = $itemsPerPage;
        $this->page = $page;
    }

    public function network_id(): int
    {
        return $this->network_id;
    }

    public function getItemsPerPage(): int
    {
        return $this->itemPerPage;
    }

    public function getPage(): int
    {
        return $this->page;
    }
}

IsGreaterThan类是您的断言实现,如果不满意,则应抛出异常(即:\ InvalidArgument)。