【问题标题】:Command pattern + pagination命令模式+分页
【发布时间】:2018-07-31 07:52:06
【问题描述】:

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

<?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;
    }
}

但我需要对结果进行分页。

现在我将分页作为参数放置在处理方法中,如下所示,但我觉得句柄应该只有一个参数 - 命令。

<?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;
    }
}

问题:

如何正确地做到这一点?我应该将分页参数放在我的命令中吗?

【问题讨论】:

  • 你使用什么框架?
  • Symfony 但我认为这在这里不重要?你想说这应该由我的框架来完成?
  • 这似乎是一个与框架相关的问题。谁以及如何调用handle 方法?
  • 这是从rest api调用的,我让rest api客户端可以更改itemsPerPage,因此应该以某种方式将其传递给命令或处理程序。还有其他建议吗?
  • 感谢康斯坦丁

标签: php rest symfony cqrs command-pattern


【解决方案1】:

您应该在 GetCardsByNetworkId 构造中请求 itemsPerPage 和 page 参数。

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

你会有类似的东西:

<?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)。

【讨论】:

  • 您能否提供一些文章或其他东西来确认这种态度是最好的:)?
  • 所有调度器应该关心的是它应该调度的命令,所以这实际上是正确的方法。命令应该接受它完成任务所需的一切——包括你想要获取的结果页面。
  • @Arkowsky,当然 :) 我推荐这篇 Matthias Noback 博客文章,它提供了很多关于命令总线的答案(请参阅“如何从命令总线返回值”部分)。 matthiasnoback.nl/2015/01/some-questions-about-the-command-bus
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 2010-12-02
  • 1970-01-01
相关资源
最近更新 更多