我有UserMapper和UserAdapter类。也是UserInterface和User类。
我从第三方服务中获得了一些数据。 UserAdapter类实现了UserInterface,以将第3方数据与我自己的User类进行匹配。
在UserMapper类中,我具有getAll,getById,删除,更新方法。
在getAll方法中,我想返回一组用户。我也有一个Users数组迭代器类。 getAll方法从第三方获取原始数据。通过foreach循环,我创建了User对象,并将它们附加到集合中。最后,我返回一个Users集合。
问题是创建User对象不是那么优雅。我正在寻找一种更好的方法来做同样的事情。我可能会混淆一些设计模式,所以如果想法完全错误,请修复我。
注意:使用类和几种方法可以轻松完成同一件事,但主要思想是将第三方数据脱钩并创建纯域层。还返回适当的对象/数据类型,以简化调试和易于理解的代码。有简化的示例。真正的业务逻辑比这更复杂。
User implements UserInterface {
protected $id;
protected $name;
protected $age;
protected $sex;
public function __construct($id) {
$this->id = $id;
}
public function getId() {
return $this->id;
}
public function setName($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
public function setAge($age) {
$this->age = $age;
}
public function getAge() {
return $this->age;
}
public function setSex($sex) {
$this->sex = $sex;
}
public function getSex() {
return $this->sex;
}
}
UserInterface {
public function getId();
public function getName();
public function getAge();
public function getSex();
}
UserAdapter implements UserInterface {
protected $rawData;
public function __construct($rawData) {
$this->rawData = $rawData;
}
public function getId() {
return $this->rawData['id'];
}
public function getName() {
return $this->rawData['name']
}
public function getAge() {
return $this->rawData['age']
}
public function getSex() {
return $this->rawData['sex']
}
Users extends IteratorIterator {
private $iterator;
public function __construct(ArrayIterator $iterator)
{
$this->iterator = $iterator;
parent::__construct($iterator);
}
public function current(): User
{
parent::current();
}
public function toArray()
{
return iterator_to_array($this->iterator, true);
}
}
UserMapper {
public function getAll($rawUsers): Users {
$users = new ArrayIterator();
foreach ($$rawUsers as $rawUser) {
$adapter = new UserAdapter($rawUser);
$user = new User($adapter->getId());
$user->setName($adapter->getName());
$user->setAge($adapter->getAge());
$user->setSex($adapter->getSex());
$users->append($user);
}
$return new Users($users);
}
}
}