在这种情况下如何使用 DTO?

How to use DTO in this case?

我的控制器中有很多方法,现在看起来像这样:

class ItemController
{
     public function getItems(Request $request)
     {
         return $this->itemService->getItems($this->getUser(), $request->get('category_id'));
     }

     public function getItem(int $id, Request $request)
     {
         return $this->itemService->getItem($this->getUser(), $id, $request->get('category_id'));
     }

     public function patchItem(ItemDTO $item, Request $request)
     {
         return $this->itemService->patchItem($this->getUser(), $item, $request->get('category_id'));
     }
}

我想避免将大量参数传输到远程接口,并将 categoryIdiduser 添加到我的 ItemDTO。如果我的 ItemDTO 中有很多字段,但我只使用两个字段,这是一种好方法吗?像这样:

 public function getItem(int $id, Request $request)
 {
     $itemDTO = new ItemDTO($this->getUser(), $id, $request->get('category_id')); //here $title and others is empty
     return $this->itemService->getItem($itemDTO);
 }

我的 DTO 是这样的:

class ItemDTO
{
    final public $user;

    final public $id;

    final public $categoryId;

    final public $title;

    //...

    public function __construct($user = null, $id = null, $categoryId = null, $title = null, ...)
    {
       //assign variables
    }
}

也许每个方法都需要单独的 DTO?此外,DTO 是否可以包含 $pageNumber$pageSize 等字段和其他过滤器?这是好方法吗?

如果您只是考虑使用这两个参数,我会将其视为示例查询模式,并且它是完全可以接受的。因为您正在考虑添加诸如 PageNumber 和 PageSize 之类的东西,我想说您已经把它搞砸了,您现在应该考虑一个单独的 ItemQuery DTO,它具有您需要的参数。