### 概述
数据映射器是一种数据访问层,它执行持久性数据存储(通常是关系数据库)和内存数据表示(域层)之间的数据双向传输。 该模式的目标是保持内存表示和持久数据存储相互独立,并
保持数据映射器本身。 该层由一个或多个映射器(或数据访问对象)组成,执行数据传输。 映射器实现的范围有所不同。 通用映射器将处理许多不同的域实体类型,专用映射器将处理一
个或几个。
### 实例
~~~
class User{
private $username;
private $email;
public function __construct($username, $email)
{
$this->username = $username;
$this->email = $email;
}
public static function fromState(array $state): User
{
return new self(
$state['username'],
$state['email']
);
}
public function getUsername()
{
return $this->username;
}
public function getEmail()
{
return $this->email;
}
}
class StorageAdapter{
private $data = [];
public function __construct(array $data)
{
$this->data = $data;
}
public function find(int $id)
{
if(isset($this->data[$id])){
return $this->data[$id];
}
return null;
}
}
class UserMapper{
private $adapter;
public function __construct(StorageAdapter $storage)
{
$this->adapter = $storage;
}
/**
* 根据ID从储存器中找到用户,并返回一个用户对象
* 在内存中,通常这种逻辑使用Repository模式来实现
* 然后,中的部分是在下面的mapRowToUser()中,它将从中创建一个业务对象
* 从储存中获取的数据
*/
public function findById(int $id): User
{
$res = $this->adapter->find($id);
if($res === null){
throw new Exception("not found");
}
return $this->mapRowToUser($res);
}
private function mapRowToUser(array $row): User
{
return User::fromState($row);
}
}
$storage = new StorageAdapter([1=>['username'=>'jack','email'=>'7740280@qq.com']]);
$mapper = new UserMapper($storage);
$user = $mapper->findById(1);
var_dump($user instanceof User);
~~~
~~~
true
~~~