我有一个REST API。我需要创建演示文稿(DTO)对象,但该对象的构建取决于请求 - 它有15%的差异。 我不知道我应该使用什么样的模式。基于多个参数创建不同的对象
我的情况:
//presentation-DTO
class Item {
private $name;
private $price;
private $tags;
private $liked; //is Liked by logged user
...
public function __construct(Item $item, bool $liked, ...)
{
$this->name = $item->getName();
$this->price = $item->getPrice();
$this->tags = $item->getTags();
$this->liked = $liked;
...
}
}
当没有登录的用户 - 我不需要$喜欢
当显示的产品清单 - 我不需要$标签
而且还有更多的属性可以像上面那样工作。
我的第一个想法是使用Builder原理。
$itemBuilder = new ItemBuilder();
$itemBuilder->setItem($item);
...
if($user) {
$itemBuilder->setUserLiked($userLiked);
...
}
return $itemBuilder->build();
它解决了我在构造函数中有太多参数的问题。
但是,我还不需要构建所有参数 - 例如。我不需要标签(在列表上)。由于我使用延迟加载,我不想让我的dto构造函数调用它们。
所以我想,也许工厂..但是然后我的问题与太多(和可选)参数返回。
你将如何解决这个问题?
**当** [1]你不想没有登录用户通过'$ liked'作为构造函数的参数? **或** [2]可以将'$ liked'作为参数传递给构造函数,但不想调用'$ this-> liked = $ item-> getLiked();'因为'当用户未被记录在 - 我不需要$喜欢'。多解释一下。 – sameerkn
有两种情况。 [a]关于$喜欢的信息来自分开的数据。我无法从$ item对象获取它们 - 需要将它们作为参数传递。 [b]关于$ tokes的信息来自$ item对象,但我不希望它们在构造函数中被调用,当我不需要它们时。所以在[a]的情况下,我不想通过它们[1]。如果[b] - 我不想打给他们。在bot病例中,我不想在dto对象中拥有这个属性 - 如果我不需要它们的话。 – Anna