Laravel存储库模式解释

时间:2017-05-06 13:03:12

标签: php laravel repository-pattern

我使用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);
}

你可以看到我已经像参数一样指定了雄辩的User模型。

雄辩的实现如下:

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

所以我的问题:

在我的界面中对强有力的User模型进行硬编码是不对的?在网络上的很多例子中,我看到人们这样做但是如果我想交换雄辩的实现与基于文件的实现?这是一个问题,因为我必须将User模型传递给更新方法!

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

&GT;问题#2:

我应该如何处理分页?

例如,在我的雄辩UserRepository中,我的方法看起来像这样:

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

这是错的吗?我应该只在控制器中分页吗?

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

1 个答案:

答案 0 :(得分:3)

问题1

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

这种模式的目标是让事情变得更容易,更快捷。当您使用存储库模式时,您可能会远离它。

要真正使用存储库模式,您必须创建数据传输对象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,我建议你在rails项目上看到一些ruby!他们在这种模式中非常出色:)

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

如果项目小而快,请使用框架为您提供的内容(我不是说放松并制作错误的代码)。如果它是一个大项目,团队中有很多开发人员,并且您知道最终您可能想要更改数据访问层,请考虑存储库模式。

当然有时候我们可以采取错误的架构决策,但这是我们学习的方式!并继续阅读有关模式的内容,我认为您正在走上成为优秀建筑师的良好道路:)

问题2

这取决于你上面的决定。如果它的Eloquent按原样使用ActiveRecord,那么在哪里调用它(控制器或某些中产阶级)并不重要。只需遵循一些模式。如果您在Controller中调用始终,请在Controller中执行此操作。否则,你的代码就会迷失。

使用Repository,我认为在存储库中它很好:)