热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

我的Laravel存储库模式解决方案(仅30行代码)

30行脚本最终可以为Laravel应用中的存储库模式提供一个很好的解决方案。链接到Github页面问题Laravel提供了一种通过Eloquent(对象关系映射&#x

30行脚本最终可以为Laravel应用中的存储库模式提供一个很好的解决方案。

链接到Github页面

问题

Laravel提供了一种通过Eloquent(对象关系映射)查询数据库的漂亮方法。 您的项目变大的那一刻开始出现问题。 实体和模型之间的差异开始变得模糊。 让我举一个例子:

我们有两种方法,一种叫做findByName ,另一种叫做concatName

class Product extends Model
{/*** The table associated with the model.** @var string*/protected $table = 'products' ;/*** Find published product by name* @param string $name* @return Product*/public function findByName (string $name) : Product {return $this ->whereName($name)->whereIsPublished( 1 )->first();}/*** Say we want to concat the name and a category name* @return string */public function concatName () : string {return $this ->attributes[ 'name' ] . ' - ' . $this ->attributes[ 'category_name' ];}
}

我们实际上在这里所做的是将用于检索(集合)产品的方法与用于1个产品实例的方法混合在一起。

一种更干净的方法是将它们分为两个不同的类。 一种用于获取模型的实例和集合,另一种用于模型定义本身。 您可以将其称为存储库模式。

分为2类

Laravel有几个库可以开始使用存储库模式。 对我来说,一个很大的缺点是您不能在存储库上使用Eloquent函数。 由于Eloquent是我使用Laravel的重要原因,所以我仍然希望能够在存储库上使用Eloquent来获取模型。

解决方案

我创建了一个非常简单的代码,可以在您的存储库中启用Eloquent的所有功能 。 这样,您就可以以一种有趣的方式使用存储库模式,并保持模型和存储库的清洁! 使用laravel-repositories如下所示:

use MrAtiebatie \ Repository ;
use Illuminate \ Database \ Eloquent \ Model ;/*** Product repository*/
class ProductRepository extends Model
{use Repository ;/*** The model being queried.** @var \Illuminate\Database\Eloquent\Model*/protected $model;/*** Constructor*/public function __construct () {$this ->model = app(Product::class);}/*** Find published products by SKU* @param {int} $sku* @return {Product}*/public function findBySku (int $sku) : Product {return this->whereIsPublished( 1 )->whereSku($sku)->first();}
}

通过使用存储库特征和$model属性, laravel-repositories知道要查询的模型,在哪里使用Eloquent以及在哪里使用您自己的存储库方法。

有了存储库的此定义,我们现在可以在控制器,作业,命令等中使用它:

get( '/' , function (\App\Repositories\ProductRepository $productRepo) {// Use any Eloquent feature directly$productRepo->all()->dd();// Use your custom repository methodsecho $productRepo->findBySku( 12345 )->name;// You can even query relationsecho $productRepo->first()->category;});

链接到Github页面

去尝试一下,给我一些改进的反馈!

我目前正在使用Laravel Pigeon,这是一个用于与您的用户进行通信和调试通知的通知中心。 注册抢先体验!

From: https://hackernoon.com/the-best-laravel-repositories-solution-in-30-lines-of-code-ee1553z31



推荐阅读
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • 离线安装Grafana Cloudera Manager插件并监控CDH集群
    本文详细介绍如何离线安装Cloudera Manager (CM) 插件,并通过Grafana监控CDH集群的健康状况和资源使用情况。该插件利用CM提供的API接口进行数据获取和展示。 ... [详细]
  • 本文探讨了如何在Classic ASP中实现与PHP的hash_hmac('SHA256', $message, pack('H*', $secret))函数等效的哈希生成方法。通过分析不同实现方式及其产生的差异,提供了一种使用Microsoft .NET Framework的解决方案。 ... [详细]
  • 探讨ChatGPT在法律和版权方面的潜在风险及影响,分析其作为内容创造工具的合法性和合规性。 ... [详细]
  • 本文介绍了如何通过Java代码计算一个整数的位数,并展示了多个基础编程示例,包括求和、平均分计算、条件判断等。 ... [详细]
  • 深入解析 Golang 中的 Cache::remember 方法实现
    本文详细探讨了如何在 Golang 中实现类似于 Laravel 的 Cache::remember 方法,通过具体的代码示例和深入的分析,帮助读者更好地理解和应用这一技术。 ... [详细]
  • C#设计模式学习笔记:观察者模式解析
    本文将探讨观察者模式的基本概念、应用场景及其在C#中的实现方法。通过借鉴《Head First Design Patterns》和维基百科等资源,详细介绍该模式的工作原理,并提供具体代码示例。 ... [详细]
  • Appium + Java 自动化测试中处理页面空白区域点击问题
    在进行移动应用自动化测试时,有时会遇到某些页面没有返回按钮,只能通过点击空白区域返回的情况。本文将探讨如何在Appium + Java环境中有效解决此类问题,并提供详细的解决方案。 ... [详细]
  • 基于Node.js、Express、MongoDB和Socket.io的实时聊天应用开发
    本文详细介绍了使用Node.js、Express、MongoDB和Socket.io构建的实时聊天应用程序。涵盖项目结构、技术栈选择及关键依赖项的配置。 ... [详细]
  • 利用Selenium与ChromeDriver实现豆瓣网页全屏截图
    本文介绍了一种使用Selenium和ChromeDriver结合Python代码,轻松实现对豆瓣网站进行完整页面截图的方法。该方法不仅简单易行,而且解决了新版Selenium不再支持PhantomJS的问题。 ... [详细]
  • 本文介绍如何使用MFC和ADO技术调用SQL Server中的存储过程,以查询指定小区在特定时间段内的通话统计数据。通过用户界面选择小区ID、开始时间和结束时间,系统将计算并展示小时级的通话量、拥塞率及半速率通话比例。 ... [详细]
  • PHP 实现多级树形结构:构建无限层级分类系统
    在众多管理系统中,如菜单、分类和部门等模块,通常需要处理层级结构。为了高效管理和展示这些层级数据,本文将介绍如何使用 PHP 实现多级树形结构,并提供代码示例以帮助开发者轻松实现无限分级。 ... [详细]
  • 简化报表生成:EasyReport工具的全面解析
    本文详细介绍了EasyReport,一个易于使用的开源Web报表工具。该工具支持Hadoop、HBase及多种关系型数据库,能够将SQL查询结果转换为HTML表格,并提供Excel导出、图表显示和表头冻结等功能。 ... [详细]
  • 本文将探讨2015年RCTF竞赛中的一道PWN题目——shaxian,重点分析其利用Fastbin和堆溢出的技巧。通过详细解析代码流程和漏洞利用过程,帮助读者理解此类题目的破解方法。 ... [详细]
author-avatar
也许吧但不是2007029SES
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有