我使用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);
}
这是错的吗?我应该只在控制器中分页吗?
一个好的解释会对我有所帮助。
答案 0 :(得分:3)
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!他们在这种模式中非常出色:)
现在我的想法是:做出对项目有益的事情。简单一点,与您的团队一起思考并为您构建最佳实践。不要总是使用相同的模式,因为有人告诉你。
如果项目小而快,请使用框架为您提供的内容(我不是说放松并制作错误的代码)。如果它是一个大项目,团队中有很多开发人员,并且您知道最终您可能想要更改数据访问层,请考虑存储库模式。
当然有时候我们可以采取错误的架构决策,但这是我们学习的方式!并继续阅读有关模式的内容,我认为您正在走上成为优秀建筑师的良好道路:)
这取决于你上面的决定。如果它的Eloquent按原样使用ActiveRecord,那么在哪里调用它(控制器或某些中产阶级)并不重要。只需遵循一些模式。如果您在Controller中调用始终,请在Controller中执行此操作。否则,你的代码就会迷失。
使用Repository,我认为在存储库中它很好:)