Шаблон команды + нумерация страниц

У меня есть команда, которая используется для получения некоторой коллекции объектов.

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

Вопрос:

Как сделать это правильно? Должен ли я разместить параметры пагинации в моей команде?

0

Решение

Вы должны запросить itemsPerPage и аргументы страницы в вашей конструкции GetCardsByNetworkId.

Это не позволит вашей Команде обрабатывать проверку пагинации (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 — это ваша реализация assert, которая должна выдавать исключение (то есть: \ InvalidArgument), если оно не выполнено.

1

Другие решения

Других решений пока нет …