您的位置:首页 > 编程语言 > PHP开发

对laravel5概念的理解 -- 资源库模式(Repository)

2016-07-08 12:38 543 查看
Repository就是个仓库管理员,仓库里面有redis数据库,mongodb数据库,mysql数据库等等。领域层无需关心这些数据库各自的类文件放哪里,只需要告诉Repository需要哪一个,由Repository拿出来给领域层。可以看到,好处就是领域层可以方便地切换数据库,理论上只要改一处配置,无需改太多代码。

来个例子:http://laravelacademy.org/post/3053.html


Post.php(用途:定义Post数据结构)

<?php

namespace DesignPatterns\More\Repository;

/**
* Post 类
* @package DesignPatterns\Repository
*/
class Post
{
/**
* @var int
*/
private $id;

/**
* @var string
*/
private $title;

/**
* @var string
*/
private $text;

/**
* @var string
*/
private $author;

/**
* @var \DateTime
*/
private $created;

/**
* @param int $id
*/
public function setId($id)
{
$this->id = $id;
}

/**
* @return int
*/
public function getId()
{
return $this->id;
}

/**
* @param string $author
*/
public function setAuthor($author)
{
$this->author = $author;
}

/**
* @return string
*/
public function getAuthor()
{
return $this->author;
}

/**
* @param \DateTime $created
*/
public function setCreated($created)
{
$this->created = $created;
}

/**
* @return \DateTime
*/
public function getCreated()
{
return $this->created;
}

/**
* @param string $text
*/
public function setText($text)
{
$this->text = $text;
}

/**
* @return string
*/
public function getText()
{
return $this->text;
}

/**
* @param string $title
*/
public function setTitle($title)
{
$this->title = $title;
}

/**
* @return string
*/
public function getTitle()
{
return $this->title;
}
}


PostRepository.php(用途:跟领域层打交道的类,从指定的数据存储器中获取值,组织成Post规定的数据结构返回。也就是说无论使用哪个数据存储器,返回的Post数据结构都一样的)

<?php

namespace DesignPatterns\More\Repository;

use DesignPatterns\More\Repository\Storage;

/**
* Post 对应的 Repository
* 该类介于数据实体层(Post) 和访问对象层(Storage)之间
*
* Repository 封装了持久化对象到数据存储器以及在展示层显示面向对象的视图操作
*
* Repository 还实现了领域层和数据映射层的分离和单向依赖
*
* PostRepository 类
* @package DesignPatterns\Repository
*/
class PostRepository
{
private $persistence;

public function __construct(Storage $persistence)
{
$this->persistence = $persistence;
}

/**
* 通过指定id返回Post对象
*
* @param int $id
* @return Post|null
*/
public function getById($id)
{
$arrayData = $this->persistence->retrieve($id);
if (is_null($arrayData)) {
return null;
}

$post = new Post();
$post->setId($arrayData['id']);
$post->setAuthor($arrayData['author']);
$post->setCreated($arrayData['created']);
$post->setText($arrayData['text']);
$post->setTitle($arrayData['title']);

return $post;
}

/**
* 保存指定对象并返回
*
* @param Post $post
* @return Post
*/
public function save(Post $post)
{
$id = $this->persistence->persist(array(
'author' => $post->getAuthor(),
'created' => $post->getCreated(),
'text' => $post->getText(),
'title' => $post->getTitle()
));

$post->setId($id);
return $post;
}

/**
* 删除指定的 Post 对象
*
* @param Post $post
* @return bool
*/
public function delete(Post $post)
{
return $this->persistence->delete($post->getId());
}
}


Storage.php(用途:定义数据存储器接口,所有的数据存储类文件都要继承该接口。这样对PostRepository而言无需关心具体使用哪种数据库,只需要跟规范的数据接口打交道,这样就实现了松耦合)

<?php

namespace DesignPatterns\More\Repository;

/**
* Storage接口
*
* 该接口定义了访问数据存储器的方法
* 具体的实现可以是多样化的,比如内存、关系型数据库、NoSQL数据库等等
*
* @package DesignPatterns\Repository
*/
interface Storage
{
/**
* 持久化数据方法
* 返回新创建的对象ID
*
* @param array() $data
* @return int
*/
public function persist($data);

/**
* 通过指定id返回数据
* 如果为空返回null
*
* @param int $id
* @return array|null
*/
public function retrieve($id);

/**
* 通过指定id删除数据
* 如果数据不存在返回false,否则如果删除成功返回true
*
* @param int $id
* @return bool
*/
public function delete($id);
}


MemoryStorage.php

<?php

namespace DesignPatterns\More\Repository;

use DesignPatterns\More\Repository\Storage;

/**
* MemoryStorage类
* @package DesignPatterns\Repository
*/
class MemoryStorage implements Storage
{

private $data;
private $lastId;

public function __construct()
{
$this->data = array();
$this->lastId = 0;
}

/**
* {@inheritdoc}
*/
public function persist($data)
{
$this->data[++$this->lastId] = $data;
return $this->lastId;
}

/**
* {@inheritdoc}
*/
public function retrieve($id)
{
return isset($this->data[$id]) ? $this->data[$id] : null;
}

/**
* {@inheritdoc}
*/
public function delete($id)
{
if (!isset($this->data[$id])) {
return false;
}

$this->data[$id] = null;
unset($this->data[$id]);

return true;
}
}


老实说,我的拙见是这玩意没啥大用,哪家公司没事换个数据库,乍一看例子中的做法是,一个表就要来一个Repository和一个数据结构类,中大型应用上百个表,这是要文件成灾的节奏吧。

在laravel中,支持

MySQL
Postgres
SQLite
SQL Server

这四种数据库切换,只需在配置文件中定义,然后可以直接使用DB或ORM访问
详见:

https://laravel.com/docs/5.2/database

Read / Write Connections
Sometimes you may wish to use one database connection for SELECT statements, and another for INSERT, UPDATE, and DELETE statements. Laravel makes this a breeze, and the proper connections will always be used whether you are using raw queries, the query builder, or the Eloquent ORM.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息