2017-05-06 54 views
3

我正在使用Repository Pattern(我对这种模式很新)的Laravel 5.4项目中工作。我有一个红色的很多关于这个在网络上,但我仍然有两个重要的问题:Laravel存储库模式说明

>问题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,这个问题的解决办法是什么?

>问题2:

我应该如何处理分页?

举例来说,在我的雄辩UserRepository我有看起来像这样的方法:

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

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

一个很好的解释会帮助我很多。

回答

2

问题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,我建议你在rails项目上看到一些ruby!他们真的很擅长这种模式:)

现在我真的在想:做什么对项目有好处。简单一点,与您的团队一起思考并为您建立最佳实践。不要总是使用相同的模式,因为有人告诉过你。

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

当然有时候我们可以做出错误的架构决定,但这是我们学习的方式!并保持阅读的模式,我认为你是以下一个很好的路径是一个伟大的建筑师:)

问题2

这取决于你在前面已经做出了什么决定。如果它使用ActiveRecord的雄辩,不管在哪里调用它(控制器或一些中产阶级)。只要遵循一些模式。如果您在控制器中调用,则始终在中执行此操作。否则你会迷失在你的代码中。

使用存储库,我认为里面的存储库,它是好的:)