草庐IT

php - Laravel 仓库模式解释

coder 2024-04-17 原文

我在我的 Laravel 5.4 项目中使用 Repository Pattern(我对那个模式很陌生)。我已经在网上对此进行了很多讨论,但我仍然有两个重要问题:

> 问题 #1:

假设我使用 Laravel ORM Eloquent 并且我有一个如下所示的界面:

<?php

namespace App\Repositories\User;

interface UserRepoInterface
{
    /**
     * @param array $user
     */
    public function update(array $request, User $user);
}

你可以看到我已经像参数一样指定了 eloquentUser 模型。

Eloquent 实现看起来像这样:

public function update(array $request, User $user)
{
    $user->name             = $request['name'];
    $user->last_name        = $request['last_name'];
    $user->email            = $request['email'];
    $toUpdate->save();
}

所以我的问题是:

在我的界面中硬编码 Eloquent User 模型是错误的吗? 在网络上的许多示例中,我看到人们这样做但是如果我想交换基于文件的实现的 Eloquent 实现?这是个问题,因为我必须将 User 模型传递给更新方法!

如果我只声明 $user 而不是 User $user,这个问题的解决方案是什么?

> 问题 #2:

我应该如何处理分页?

例如,在我 Eloquent UserRepository 中,我有一个如下所示的方法:

public function index()
{
    return User::orderBy('name', 'asc')
        ->withCount('messages')
        ->with('corporation')
        ->paginate(10);
}

这是错的吗?我应该只在我的 Controller 中分页吗?

一个好的解释会对我有很大帮助。

最佳答案

问题1

Laravel 使用 ActiveRecord 作为其模型 + 数据访问层的模式。

这种模式的目的是让事情变得更容易和更快。当您使用 Repository 模式时,您有点在逃避它。

要真正使用存储库模式,您必须创建数据传输对象 DAT(在 Java 中,他们称之为 POJO)。然后,将 Eloquent 实体用作实体管理器。

POPO

class User {

  private $id;
  private $a;

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

  public setA ($a) { $this->a = $a; } 
  public getA () { return $this->a; } 
}

实体管理器

class UserEloquent extends Eloquent {
   protected $_table = 'user';
}

存储库

class EloquentUserRepository implements UserReposistory {
   private $em;

   public __constructor (UserEloquent $em) { $this->em = $em; }

   public update (User $dat) {
     $user  = $em->find($dat->getId());
     $user->a = $dat->getA();
     $user->save();
   }
}

你能看出它有多冗长吗?如果你真的想使用这种方法,我建议你使用 Doctrine .

但是如果你想按原样使用 ActiveRecord,我建议你看一些 ruby​​ on rails 项目!他们真的很擅长这种模式:)

现在我真正的想法是:做对项目有利的事情。让它变得简单,与您的团队一起思考并为您构建最佳实践。不要总是使用相同的模式,因为有人告诉你。

如果项目小而快,使用框架给你的东西(我不是说要放松并编写糟糕的代码)。如果这是一个大项目,团队中有很多开发人员,并且您知道最终可能想要更改数据访问层,请考虑存储库模式。

当然,有时我们会做出错误的架构决策,但这就是我们学习的方式!并继续阅读有关模式的内容,我认为您正在走一条成为伟大架构师的好道路:)

问题2

这取决于您在上面做出的决定。如果它的 Eloquent 原样使用 ActiveRecord,那么在哪里调用它(Controller 或某些中间类)并不重要。只要遵循一些模式。如果您在 Controller 中调用,总是在 Controller 中执行。否则您会迷失在代码中。

使用 Repository,我觉得在 repository 里面没问题 :)

关于php - Laravel 仓库模式解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43820794/

有关php - Laravel 仓库模式解释的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  4. ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz) - 2

    我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法

  5. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  6. ruby-on-rails - environment.rb 中设置的常量在开发模式中消失 - 2

    了解Rails缓存如何工作的人可以真正帮助我。这是嵌套在Rails::Initializer.runblock中的代码:config.after_initializedoSomeClass.const_set'SOME_CONST','SOME_VAL'end现在,如果我运行script/server并发出请求,一切都很好。然而,在我的Rails应用程序的第二个请求中,一切都因单元化常量错误而变得糟糕。在生产模式下,我可以成功发出第二个请求,这意味着常量仍然存在。我已通过将以上内容更改为以下内容来解决问题:config.after_initializedorequire'some_cl

  7. ruby - 解释为局部变量会覆盖方法名称吗? - 2

    如thisquestion,当在其自己的赋值中使用未定义的局部变量时,它的计算结果为nil。x=x#=>nil但是当局部变量的名称与现有的方法名称冲突时,就比较棘手了。为什么下面的最后一个示例返回nil?{}.instance_eval{a=keys}#=>[]{}.instance_eval{keys=self.keys}#=>[]{}.instance_eval{keys=keys}#=>nil 最佳答案 在Ruby中,因为可以在没有显式接收器和括号的情况下调用方法,所以在局部变量引用和无接收器无参数方法调用之间存在语法歧义:f

  8. 语法类似于 GitHub Flavored Markdown 的 Ruby markdown 解释器? - 2

    我使用Jekyll运行博客,并认为我会解决RedcarpetMarkdown解释器,因为它是developedandusedbyGitHub.好吧,我只是碰巧遇到了一个错误,去检查问题,然后foundthis.Maintainersays,"Asyouprobablyhavenoticed(harharharhar)Idon'thavetimetomaintainRedcarpetanymore.It'snotapriorityforme(IfindMarkdownthoroughlyboring)andit'snotapriorityforGitHub,becausewenolong

  9. Ruby:标准递归模式 - 2

    我经常迷上ruby​​的一件事是递归模式。例如,假设我有一个数组,它可能包含无限深度的数组作为元素。所以,例如:my_array=[1,[2,3,[4,5,[6,7]]]]我想创建一个方法,可以将数组展平为[1,2,3,4,5,6,7]。我知道.flatten可以完成这项工作,但这个问题是作为我经常遇到的递归问题的一个例子-因此我试图找到一个更可重用的解决方案。简而言之-我猜这种事情有一个标准模式,但我想不出任何特别优雅的东西。任何想法表示赞赏 最佳答案 递归是一种方法,它不依赖于语言。您在编写算法时要考虑两种情况:再次调用函数的情

  10. ruby - 在 Ruby 中查找多个正则表达式匹配的模式和位置 - 2

    这应该是一个简单的问题,但我找不到任何相关信息。给定一个Ruby中的正则表达式,对于每个匹配项,我需要检索匹配的模式$1、$2,但我还需要匹配位置。我知道=~运算符为我提供了第一个匹配项的位置,而string.scan(/regex/)为我提供了所有匹配模式。如果可能,我需要在同一步骤中获得两个结果。 最佳答案 MatchDatastring.scan(regex)do$1#Patternatfirstposition$2#Patternatsecondposition$~.offset(1)#Startingandendingpo

随机推荐