目標
資料映射器是一種資料訪問層,用于將資料在持久性資料存盤(通常是一個關系資料庫)和記憶體中的資料表示(領域層)之間進行雙向傳輸,該模式的目標是為了將資料的記憶體表示、持久存盤、資料訪問進行分離, 該層由一個或多個映射器(或資料訪問物件)組成,并且進行資料的轉換,映射器實作的范圍有所不同, 通用映射器將處理許多不同的域物體型別,專用映射器將處理一個或幾個,
例子
資料庫物件關系映射器( ORM ):Doctrine2 使用的 DAO,名字叫做 “EntityRepository”,
UML 圖

★官方PHP高級學習交流社群「點擊」管理整理了一些資料,BAT等一線大廠進階知識體系備好(相關學習資料以及筆面試題)以及不限于:分布式架構、高可擴展、高性能、高并發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階干貨
代碼
- User.php
<?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;
}
}
- UserMapper.php
<?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);
}
}
- StorageAdapter.php
<?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;
}
}
測驗
- Tests/DataMapperTest.php
<?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 互聯網架構師成長之路*「設計模式」終極指南
PHP 互聯網架構師 50K 成長指南+行業問題解決總綱(持續更新)
面試10家公司,識訓9個offer,2020年PHP 面試問題
★如果喜歡我的文章,想與更多資深開發者一起交流學習的話,獲取更多大廠面試相關技術咨詢和指導,歡迎加入我們的群啊,暗號:phpzh(群ID:856460874),
2020年最新PHP進階教程,全系列!
內容不錯的話希望大家支持鼓勵下點個贊/喜歡,歡迎一起來交流;另外如果有什么問題 建議 想看的內容可以在評論提出
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/60814.html
標籤:其他
下一篇:疫情資料分析的模型選擇
