php设计一个盒子类代码_知识点 | PHP设计模式之数据映射模式(Data Mapper)代码实例大全...

目标

数据映射器是一种数据访问层,用于将数据在持久性数据存储(通常是一个关系数据库)和内存中的数据表示(领域层)之间进行双向传输。该模式的目标是为了将数据的内存表示、持久存储、数据访问进行分离。该层由一个或多个映射器(或数据访问对象)组成,并且进行数据的转换。映射器实现的范围有所不同。通用映射器将处理许多不同的域实体类型,专用映射器将处理一个或几个。

例子

数据库对象关系映射器( ORM ):Doctrine2 使用的 DAO,名字叫做 “EntityRepository”。

UML 图

b8178cf90f4adb84e3538a4df8f821ac.png

★官方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;
}
}
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

  • 15

  • 16

  • 17

  • 18

  • 19

  • 20

  • 21

  • 22

  • 23

  • 24

  • 25

  • 26

  • 27

  • 28

  • 29

  • 30

  • 31

  • 32

  • 33

  • 34

  • 35

  • 36

  • 37

  • 38

  • 39

  • 40

  • 41

  • 42

  • 43

  • 44

  • 45

  • 46

  • 47

  • 48

  • 49

  • 50

  • 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);
}
}
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

  • 15

  • 16

  • 17

  • 18

  • 19

  • 20

  • 21

  • 22

  • 23

  • 24

  • 25

  • 26

  • 27

  • 28

  • 29

  • 30

  • 31

  • 32

  • 33

  • 34

  • 35

  • 36

  • 37

  • 38

  • 39

  • 40

  • 41

  • 42

  • 43

  • 44

  • 45

  • 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;
}
}
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

  • 15

  • 16

  • 17

  • 18

  • 19

  • 20

  • 21

  • 22

  • 23

  • 24

  • 25

  • 26

  • 27

  • 28

  • 29

  • 30

测试

  • 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);
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值