php实体类映射数据库,PHP设计模式之数据映射模式(Data Mapper)代码实例大全(13)...
汐颜发表于:2020-11-19 08:18 阅读: 78次这篇教程主要讲解了PHP设计模式之数据映射模式(Data Mapper)代码实例大全(13),并附有相关的代码样列,我觉得非常有帮助,现在分享出来大家一起学习!目标数据映射器是一种数据访问层,用于将数据在持久性数据存储(通常是一个关系数据库)和内存中的数据表示(领域层)之间进行双向传输。该模式的目标是为了将数据的内存表示、持久存储、数据访
汐颜
发表于:2020-11-19 08:18 阅读: 78次
这篇教程主要讲解了PHP设计模式之数据映射模式(Data Mapper)代码实例大全(13),并附有相关的代码样列,我觉得非常有帮助,现在分享出来大家一起学习!
目标
数据映射器是一种数据访问层,用于将数据在持久性数据存储(通常是一个关系数据库)和内存中的数据表示(领域层)之间进行双向传输。该模式的目标是为了将数据的内存表示、持久存储、数据访问进行分离。 该层由一个或多个映射器(或数据访问对象)组成,并且进行数据的转换。映射器实现的范围有所不同。 通用映射器将处理许多不同的域实体类型,专用映射器将处理一个或几个。
例子
数据库对象关系映射器( ORM ):Doctrine2 使用的 DAO,名字叫做 “EntityRepository”。
UML 图
代码
User.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
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
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
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);
}
}
★如果喜欢我的文章,想与更多资深开发者一起交流学习的话,获取更多大厂面试相关技术咨询和指导,欢迎加入我们的群啊,暗号:phpzh(群ID:856460874)。
内容不错的话希望大家支持鼓励下点个赞/喜欢,欢迎一起来交流;另外如果有什么问题 建议 想看的内容可以在评论提出
分类: 开发语言
39
47
更多推荐
所有评论(0)