【发布时间】:2014-12-16 00:50:56
【问题描述】:
我想编写与框架无关的离散模型。
我为所有这些模型编写了接口。
问题是在实现这些接口时,例如使用 Eloquent,我将所有业务逻辑链接到 ORM。
例如,我想在 Product 模型上使用方法 addVariation。
界面
interface ProductInterface
{
/**
* Adds a variation
*
* @param VariationInterface $variation
*/
public function addVariation(VariationInterface $variation);
// ...
}
凝结
class Product extends Model
{
/**
* @param Collection | VariationInterface
*/
protected $variations;
public function addVariation(VarientInterface $varient)
{
if( ! $this->hasVariation($varient) )
{
$this->variations->add($variations);
}
return $this;
}
}
我遇到的问题是我的所有业务逻辑都存在于我的模型的特定 Eloquent ORM 实现中。
我怎么可能把它分开?我能看到的唯一真正的依赖是我需要某种类型的集合类?或者我可以只使用普通的旧数组?
我只是不想将我的所有逻辑链接到特定的 ORM 我想保持与框架无关。
【问题讨论】:
-
您可以创建一个与 eloquent 接口的存储库,这将允许您切换模型但保持相同的接口。我经历了类似的事情,但对于我的项目规模(不是很大),我决定让事情变得更简单。 culttt.com/2014/03/17/eloquent-tricks-better-repositories 了解更多信息。实际上,他所有的博客文章都非常适合从 laravel 开始。
-
说实话,即使您使用存储库模式,我也很难编写与框架无关的模型。据我了解,那一堆存储库本质上是通常注入 Laravel 控制器的接口。是的,您似乎将控制器与业务逻辑分开,但不要忘记那些 Laravel 控制器大量使用其他 Laravel 组件,例如 Redirect 或 View。
-
说到模型,你不能真正完全摆脱 Laravel。例如,如果你想在数据显示在视图中之前以某种方式自动重新格式化数据,你很可能会定义一些 Laravel 的 setter 和 getter:setXXXAttribute() 和 getXXXAttribute()。这个特性确实很棒,但是这样的编码会导致对 Laravel 的依赖,更不用说它们通常会扩展 Eloquent。
-
总之,对我来说,采用存储库/接口模式的好处更多是关于 Laravel 支持的应用程序的关注点分离,以及在 Laravel 上下文中更多可测试的代码,而不是你可以构建不可知论的框架楷模。 @uberweb
标签: php laravel orm solid-principles single-responsibility-principle