【问题标题】:How to keep helper methods when using Repository pattern in Laravel 5?在 Laravel 5 中使用存储库模式时如何保留辅助方法?
【发布时间】:2015-05-01 23:00:49
【问题描述】:

当使用存储库模式时,我们有接口和一些实现该接口的存储库类。如果我没记错的话,SOLID 原则之一是说这些存储库类应该为每个接口方法返回相同类型的数据,这样如果我们切换接口的实现,就不会发生任何故障。

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

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

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

【问题讨论】:

    标签: laravel repository-pattern laravel-5 solid-principles


    【解决方案1】:

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

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

    是的,这仍然意味着您将在结果集中拥有 Eloquent 特定模型,但是如果您不使用 Eloquent 特性(如属性访问器),您将可以轻松地将其替换为另一种类型的模型。

    【讨论】:

    • 是的,我明白为什么如果我使用 toArray 会丢失属性访问器。但是......这种模式的设计是为了让我可以轻松地在不同的实现之间切换。为什么每个人都这么说,但仍然返回雄辩的模型?当 Jeffrey Way 使用 toArray 函数并解释了原因时,我从 laracasts 中听说过这种 SOLID 思想。所以,如果我想切换到其他一些实现,我需要返回一个具有 getFullName 方法的对象,以便一切正常?很难记住,因为我没有在界面中描述这些“getfullName”帮助器......
    • 好吧,你可以在数组中有一个 fullName 属性,而不是 getFullName 函数。但是,即使它是 Eloquent 模型。在我看来,它可以是包含某些方法的任何类型的对象。例如,您可以使用UserModelInterface 指定这些。
    猜你喜欢
    • 2018-09-25
    • 1970-01-01
    • 2016-12-13
    • 2011-04-12
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 2016-12-12
    • 2014-03-15
    相关资源
    最近更新 更多