您现在访问的是旧版页面,请您点击下面链接访问新版:新版素材猫
欢迎您来到素材猫
充值

PHP设计模式-仓库模式Repository

  • 时间:2020-05-24 11:08 编辑:素材猫 来源:素材猫 阅读:127
  • 扫一扫,手机访问
摘要:PHP设计模式-仓库模式Repository

PHP仓库设计模式(Repository)是一个位于领域层(Domain Layer)和数据映射层(数据访问层)之间的中介层,它使用类似集合仓库的接口来访问领域对象。Repository仓库封装了持久化存储在数据库中的对象的集合和对它们的操作,为持久层提供了一种更加面向对象的方式。Repository同样对应用领域层和数据映射层之间的简洁分离和单向依赖有很大的帮助。

比如这些PHP框架Doctrine 2的ORM模块:在Entity和DBAL之间就有仓库层调停两者关系并包含获得对象的方法。其他如Laravel框架等。下面是MemoryStorage和Post数据映射层之间的Repository的PHP代码实例:

//存储接口
interface StorageInterface
{
    //持久化数据的方法,返回刚持久化的数据id
    public function persist($data);


    //获取相应id的数据
    public function retrieve($id);

    //删除相应id的数据,没有该id返回false,删除成功返回true
    public function delete($id);
}

// Domian领域层-内存存储
class MemoryStorage implements StorageInterface
{
    private $data;
    private $lastId;

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

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

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

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

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

        return true ;
    }
}

// Post数据映射层对象
class Post
{
    private $id;
    private $title;
    private $author;
    private $created;

    public function setId($id)
    {
        $this->id = $id;
    }

    public function getId()
    {
        return $this->id;
    }

    public function setTitle($title)
    {
        $this->title = $title;
    }

    public function getTitle()
    {
        return $this->title;
    }

    public function setAuthor($author)
    {
        $this ->author = $author;
    }

    public function getAuthor()
    {
        return $this->author;
    }

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

    public function getCreated()
    {
        return $this->created;
    }
}

//仓库设计模式中介,包含与上面两个类对象处理的方法
class Repository
{
    private $persistence;

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

    //根据指定ID返回Post对象
    public function getById($id)
    {
        $arrayData = $this->persistence->retrieve($id);
        if(is_null($arrayData)){
            return null;
        }

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

        return $post;
    }

    //保存Post对象并填充ID
    public function save(Post $ post)
    {
        $id = $this->persistence->persist(array(
            'title' => $post->getTitle()
            'author' => $post->getAuthor(),
            'created' => $post- >getCreated(),
        ));

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

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

  • 全部评论(0)
最新发布的资讯信息
【计算机/互联网|】你不知道的windows小秘密——上帝模式 在Win7/10中都有。(2020-06-18 15:41)
【好东西分享|】本月ProductHunt上当天排名第一的产品 - Pose Animator(2020-06-18 12:14)
【计算机/互联网|PC操作系统】微PE工具箱时隔 3 年再更新(2020-06-10 07:06)
【计算机/互联网|】Proxmox Linux 测试架设流程(2020-06-06 18:01)
【技术支持|】720云VR全景系统网站源码安装说明(2020-06-06 17:48)
【计算机/互联网|】Python 直接嵌入到 Linux 内核还感觉有些惊讶(2020-06-06 17:30)
【技术支持|】CRMEB商城搭建说明(2020-06-06 16:14)
【技术支持|】免xp框架监听短信使用教程(2020-06-05 10:51)
【计算机/互联网|】eps免费版详细装说明(2020-05-27 12:04)
【计算机/互联网|】在 Tomcat 里面部署 Web 项目的几种方式(2020-05-24 11:14)
联系我们
工作时间:8:00-23:30
客服 QQ:116622333
邮 箱:sucaimao#qq.com