У меня есть команда, которая используется для получения некоторой коллекции объектов.
<?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;
}
}
Вопрос:
Как сделать это правильно? Должен ли я разместить параметры пагинации в моей команде?
Вы должны запросить 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), если оно не выполнено.
Других решений пока нет …