资讯专栏INFORMATION COLUMN

推荐:好用的 Laravel Repository 包

MAX_zuo / 1414人阅读

摘要:但在中也不可避免的基础模式,上述问题仍然存在。这样可以完全分离和的依赖。最开始在中使用是通过定义大量的来注入,,实现具体的工作类。但是像链接调用仍然没有解决,为些我们开发出了新的仓库包。目前此包已经使用在好几个项目中目前运行良好。

什么是Repository模式,如何使用Repository模式

这里就不再啰嗦了,请参见以下几个链接
如何使用 Repository 模式?
关于 Repository 的设计模式
laravel-china.org搜索

我的使用历程 原由

MVC在如今仍然是流行趋势,但多数框架都只提供基础的MVC架构。
几年前在开发中我们经常会遇到问题Model过于臃肿,写着写着就会变成类似于万能类,最后面的人就真成了接盘侠了。
很不幸我就是其中之一。后来我就一直在思考如何才能让Model看起来清爽,功能更加单一简洁。(当时并不知道Repository),终于开始重构。一把心酸泪。。。。。最多的是组合和Trait

使用Laravel

最开始接触Laravel就是感觉它的文档清爽,以为是个简单的框架,结果不小心一入坑,才发现被它的外表给欺骗了。
但却也为此深深爱上了它,是啊,这不就是我一直追求的吗?无限的灵活性,可替换,越研究代码越发现处处都是精髓。
但在Laravel中也不可避免的基础MVC模式,上述问题仍然存在。

初期使用

一直以为我都遵循一个核心:以仓库层为处理数据基础,为SerivceController等提供数据供给,仓库需要的原始数据则通过Model中获取。这样可以完全分离ModelController的依赖。
最开始在Laravel中使用是通过定义大量的RepositoryInterface来注入,bind,实现具体的Repository工作类。
这是理想的使用方法可替换性很强。

遇到的问题

实际开发过程中Repository基本不会被替换,无数的Interface带来的规范,也带来了开发的麻烦。

在使用Repository模式中我们不断的注入Model,每个方法都需要直接Model来进行一次次的查询数据集,却失去了在外层链式调用的便捷性(这其实并不合理,但存在即有原由)。

中间的折中

后来索性在开发中我们去掉了Interface的约束,直接作用功能类来注入使用,此时简洁性和便捷性大大的提高,如果非要替换仍然bind可以解决问题。这样的开始一直持续很长时间。但是像链接调用仍然没有解决,为些我们开发出了新的仓库包。https://github.com/crcms/repository

再次轮回

开始玩微服务,开始分离代码,当然就离不开RPC,十分庆幸我们使用了Repository模式,通过开启对应的Rpc Repository,我们可以很快进行本地Repository切换,以Interface来约束。

便捷的Repository包 基础示例
class TestRepository extends AbstractRepository
{
    /**
     * @var array
     */
    protected $guard = [
        "id", "title","other"
    ];

    /**
     * @return TestModel
     */
    public function newModel(): TestModel
    {
        return app(TestModel::class);
    }

    /**
     * @param int $perPage
     * @return LengthAwarePaginator
     */
    public function paginate(AbstractMagic $magic = null, int $perPage = 15): LengthAwarePaginator
    {
        $query = $this->where("built_in", 1);

        if ($magic) {
            $query->magic($magic);
        }

        return $query->orderBy($this->getModel()->getKeyName(), "desc")->paginate($perPage);
    }

    /**
     * @param int $name
     * @param int $title
     */
    public function updateName(string $name, string $title)
    {
        $this->getModel()->where("name", $name)->update(["title" => $title]);
    }
    
}
超好用的Magic方法

在多条件搜索中,肯定会存在大量的判断,优雅度太低,如:

if($request->input("username")) {
    $query->where("username",$username)
}

if($request->input("email")) {
    $query->where("email",$email)
}

.......

但通过QueryMagic方法我们可以轻松优雅解决这些问题,示例:

创建Magic

use CrCmsRepositoryAbstractMagic;
use CrCmsRepositoryContractsQueryRelate;

class TestMagic extends AbstractMagic
{
    /**
     * @param QueryRelate $queryRelate
     * @param int $id
     * @return QueryRelate
     */
    protected function byName(QueryRelate $queryRelate, string $name)
    {
        return $queryRelate->where("name", $name);
    }

    /**
     * @param QueryRelate $queryRelate
     * @param string $title
     * @return QueryRelate
     */
    protected function byTitle(QueryRelate $queryRelate, string $title)
    {
        return $queryRelate->where("title", "like", "%{$title}%");
    }

    /**
     * @param QueryRelate $queryRelate
     * @param int $id
     * @return QueryRelate
     */
    protected function byId(QueryRelate $queryRelate, int $id)
    {
        return $queryRelate->where("id", $id);
    }
}

使用Magic(这里只是简单示例):

    public function paginate(array $condition, int $perPage = 15): LengthAwarePaginator
    {
        return $query->magic(new TestMagic($condition))->orderBy($this->getModel()->getKeyName(), "desc")->paginate($perPage);
    }
更多

开发此包的原因是在这之前我并示找到我想要的(适合我的)兼具Model的灵活性以及数据仓库的分离模式,所以为此开发了这个仓库包。目前此包已经使用在好几个项目中目前运行良好。
后面还打算兼容TP以及Yii等使用率高的框架,暂时只支持Laravel
更多详情,请移步github:https://github.com/crcms/repository

最后

哈哈,请原谅我着急的文本描述,希望对需要的人以及面临和我曾经一样困惑的人有所帮助。
原文出处:crcms-blog

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29014.html

相关文章

  • [开源] LaravelPlus - 基于 Laravel 魔改,为方便实际业务使用 - 开发中

    摘要:目的为了减少重复和新项目的配置麻烦等问题,就是为了骗星星如现有的生成工具虽然好用,但是不太喜欢样式和代码结构。有些本地,测试,线上的配置需要频繁改动的需要。 目的 为了减少重复 CURD 和新项目的配置麻烦等问题,(就是为了骗星星:LaravelPlus )如: 现有的 infyomlabs/laravel-generator CODE 生成工具虽然好用,但是不太喜欢样式和代码结构。...

    weknow619 评论0 收藏0
  • Laravel学习笔记之bootstrap源码解析

    摘要:总结本文主要学习了启动时做的七步准备工作环境检测配置加载日志配置异常处理注册注册启动。 说明:Laravel在把Request通过管道Pipeline送入中间件Middleware和路由Router之前,还做了程序的启动Bootstrap工作,本文主要学习相关源码,看看Laravel启动程序做了哪些具体工作,并将个人的研究心得分享出来,希望对别人有所帮助。Laravel在入口index...

    xiaoxiaozi 评论0 收藏0
  • 使用桩件 (Stub) 解决 Laravel 单元测试中依赖

    摘要:可是我们在做单元测试的时候,希望尽可能少的产生依赖。后记任何一个可靠的系统,单元测试都是必不可少的。庆幸的是,帮我们提供了好用的单元测试。 本文是我在实践后的一点总结,难免有不妥之处。如有幸得大神路过,还望不吝赐教,小弟在此谢过了! 很早就知道有单元测试的概念,也曾尝试过,但是一直对单元测试的概念和方法,比较模糊。在听了 @vimac 大神的讲堂 PHP单元测试与测试驱动开发 后,慢慢...

    Miyang 评论0 收藏0
  • Laravel不权威导航

    摘要:版微信第三方登陆包括微信微博等等,查看支持列表扩展好用的图片处理,也方便使用百度版百度版支付集合,包含支付宝等支付宝在的封装各国语言包,包含简体中文生成二维码工具,亲测好用未完大家可以向我推荐,直接在本文下留言即可。 Laravel不权威导航 Hi 这里是Roy整理的Laravel相关索引,希望能帮到大家showImg(http://static.segmentfault.com/bu...

    focusj 评论0 收藏0
  • 下载量最高 100 个 Laravel 扩展推荐

    摘要:本文经授权转自社区,后续更新将以帖子内容和内容为准。说明另一个令人喜欢的地方,是拥有活跃的开发者社区,而活跃的开发者社区带来的,是繁华的扩展包生态。本文对上打了标签的扩展包进行整理,截止到现在年月号,有超过个扩展包,以下是下载量最大的个。 本文经授权转自 PHPHub 社区,后续更新将以 PHPHub 帖子内容 和 GitHub 内容 为准。 说明 Laravel 另一个令人喜欢的地方...

    Tychio 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<