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

时间:2017-12-06 09:02:54

标签: php design-patterns architecture dto

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

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和其他过滤条件等字段吗?这是好方法吗?

1 个答案:

答案 0 :(得分:0)

如果您只是考虑使用这两个参数,我会认为它是一个按示例模式的查询,这是相当可以接受的。因为您正在考虑添加像PageNumber&amp ;; PageSize,我会说你已经把它搞砸了,你现在应该考虑一个单独的ItemQuery DTO,它有你需要的参数。