在 Laravel 5 中使用 Repository 模式时如何保留辅助方法?

How to keep helper methods when using Repository pattern in Laravel 5?

在使用存储库模式时,我们有接口和一些实现此接口的存储库 classes。如果我没记错的话,SOLID 原则之一说那些存储库 class 应该 return 每个接口方法的相同类型的数据,这样如果我们切换接口的实现,就不会出现故障。

如果我有一个 eloquent 存储库 class,其中 return 是所有用户的 eloquent class 的数组,例如 return User::all(),我没有一个简单的数组,而是一个 Eloquent 模型的数组。所以我可能想使用 toArray() 到 return 简单数组,这样如果我将接口的实现切换到其他一些 ORM(例如 UserDoctrineRepository 或我不知道......)一切仍然有效。

如果我理解正确,在 UserEloquentRepository 中,我们使用 eloquent 模型 class 来帮助我们使用 Eloquent 获取数据。但是,在我的模型 (User class) 中,我可能有一些辅助方法,例如 getFullName()。如果我简单地在 UserEloquentRepository 中使用 toArray(),我将不会在我的控制器中获得这个辅助方法,并且最终在我看来。

在我读过的其他文章中,他们将其保留为 return User::all(),但是,这意味着我仍然耦合到 Eloquent,因为我没有得到一个简单的数组,但是eloquent 对象数组

您从 User::all() 或基本上每个 Eloquent 查询得到的是 Illuminate\Database\Eloquent\Collection。问题是,当您在集合上调用 toArray() 时,它会将集合中的所有项目也转换为一个数组,并且您会丢失模型的所有方法。相反,您可以在集合上调用 all() 以获取模型对象数组:

$collection = User::all();
return $collection->all();

是的,这仍然意味着您的结果集中将有 Eloquent 个特定模型,但是如果您不使用 Eloquent 属性访问器等功能,您将很容易将其替换为另一种类型型号。