🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 概述 数据映射器是一种数据访问层,它执行持久性数据存储(通常是关系数据库)和内存数据表示(域层)之间的数据双向传输。 该模式的目标是保持内存表示和持久数据存储相互独立,并 保持数据映射器本身。 该层由一个或多个映射器(或数据访问对象)组成,执行数据传输。 映射器实现的范围有所不同。 通用映射器将处理许多不同的域实体类型,专用映射器将处理一 个或几个。 ### 实例 ~~~ 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 ~~~