使用存储库模式时,我们有接口和一些实现此接口的存储库类。如果我没有弄错的话,SOLID原则之一就是说那些存储库类应该为每个接口方法返回相同类型的数据,这样如果我们切换接口的实现,就不会发生故障。
如果我有一个雄辩的存储库类,它返回所有用户的雄辩类数组,如return User::all()
,我没有一个简单的数组,而是一个Eloquent模型数组。所以我可能希望使用toArray()
来返回简单数组,这样如果我将接口的实现切换到其他ORM(例如UserDoctrineRepository或者我不知道......),一切都会工作
如果我理解正确,在UserEloquentRepository中我们使用一个雄辩的模型类来帮助我们使用Eloquent获取数据。但是,在我的模型(User
类)中,我可能有一些辅助方法,如getFullName()
。如果我在UserEloquentRepository中简单地使用toArray()
,我就不会在我的控制器中获得这个帮助方法,并且最终在我看来。
在我读过的其他文章中,他们保留了return User::all()
,但是,这意味着我仍然与Eloquent结合,因为我没有得到一个简单的数组,但是雄辩的对象数组
答案 0 :(得分:0)
您从User::all()
或基本上每个Eloquent查询获得的是Illuminate\Database\Eloquent\Collection
。问题是,当您在集合上调用toArray()
时,它会将集合中的所有项目转换为数组,并且您将丢失模型的所有方法。相反,您可以在集合上调用all()
来获取模型对象数组:
$collection = User::all();
return $collection->all();
是的,这仍然意味着您的结果集中将具有Eloquent特定模型,但是如果您不使用属性访问者等Eloquent功能,则可以轻松地将其替换为其他类型的模型。