リポジトリは、ドメイン層とデータマッピング層(データアクセス層)の間にある独立した層です。この存在により、ドメイン層はデータ アクセス層の存在を認識しなくなります。これは、ドメイン層がドメイン オブジェクトにアクセスするためのコレクションのようなインターフェイスを提供します。リポジトリは倉庫管理者に必要なものを倉庫管理者に伝えるだけで、倉庫管理者は実際に物がどこに置かれているかを知る必要はありません。
リポジトリパターンはアーキテクチャを設計する際の参考となるアーキテクチャパターンです。リポジトリ パターンを適用する利点は、このパターンの実装に必要な追加コードをはるかに上回ります。プロジェクトが階層化されている場合は常に、このパターンを使用する必要があります。
Post.php
<?phpnamespace 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
<?phpnamespace 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
<?phpnamespace 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
<?phpnamespace 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; }}