數據映射器是一種數據訪問層,用於將數據在持久性數據存儲(一般是一個關係數據庫)和內存中的數據表示(領域層)之間進行雙向傳輸。該模式的目標是爲了將數據的內存表示、持久存儲、數據訪問進行分離。 該層由一個或多個映射器(或數據訪問對象)組成,而且進行數據的轉換。映射器實現的範圍有所不一樣。 通用映射器將處理許多不一樣的域實體類型,專用映射器將處理一個或幾個。php
數據庫對象關係映射器( ORM ):Doctrine2 使用的 DAO,名字叫作 「EntityRepository」。laravel
<?php namespace DesignPatterns\Structural\DataMapper; class User { /** * @var string */ private $username; /** * @var string */ private $email; public static function fromState(array $state): User { // 在你訪問的時候驗證狀態 return new self( $state['username'], $state['email'] ); } public function __construct(string $username, string $email) { // 先驗證參數再設置他們 $this->username = $username; $this->email = $email; } /** * @return string */ public function getUsername() { return $this->username; } /** * @return string */ public function getEmail() { return $this->email; } }
<?php namespace DesignPatterns\Structural\DataMapper; class UserMapper { /** * @var StorageAdapter */ private $adapter; /** * @param StorageAdapter $storage */ public function __construct(StorageAdapter $storage) { $this->adapter = $storage; } /** * 根據 id 從存儲器中找到用戶,並返回一個用戶對象 * 在內存中,一般這種邏輯將使用 Repository 模式來實現 * 然而,重要的部分是在下面的 mapRowToUser() 中,它將從中建立一個業務對象 * 從存儲中獲取的數據 * * @param int $id * * @return User */ public function findById(int $id): User { $result = $this->adapter->find($id); if ($result === null) { throw new \InvalidArgumentException("User #$id not found"); } return $this->mapRowToUser($result); } private function mapRowToUser(array $row): User { return User::fromState($row); } }
<?php namespace DesignPatterns\Structural\DataMapper; class StorageAdapter { /** * @var array */ private $data = []; public function __construct(array $data) { $this->data = $data; } /** * @param int $id * * @return array|null */ public function find(int $id) { if (isset($this->data[$id])) { return $this->data[$id]; } return null; } }
<?php namespace DesignPatterns\Structural\DataMapper\Tests; use DesignPatterns\Structural\DataMapper\StorageAdapter; use DesignPatterns\Structural\DataMapper\User; use DesignPatterns\Structural\DataMapper\UserMapper; use PHPUnit\Framework\TestCase; class DataMapperTest extends TestCase { public function testCanMapUserFromStorage() { $storage = new StorageAdapter([1 => ['username' => 'domnikl', 'email' => 'liebler.dominik@gmail.com']]); $mapper = new UserMapper($storage); $user = $mapper->findById(1); $this->assertInstanceOf(User::class, $user); } /** * @expectedException \InvalidArgumentException */ public function testWillNotMapInvalidData() { $storage = new StorageAdapter([]); $mapper = new UserMapper($storage); $mapper->findById(1); } }
PHP 互聯網架構師 50K 成長指南+行業問題解決總綱(持續更新)shell
面試10家公司,收穫9個offer,2020年PHP 面試問題數據庫
★若是喜歡個人文章,想與更多資深開發者一塊兒交流學習的話,獲取更多大廠面試相關技術諮詢和指導,歡迎加入咱們的羣啊,暗號:phpzh(羣ID:856460874)。設計模式
內容不錯的話但願你們支持鼓勵下點個贊/喜歡,歡迎一塊兒來交流;另外若是有什麼問題 建議 想看的內容能夠在評論提出架構