Laravel的Eloquent是一项活跃的记录,这项技术需要大量的处理。域实体被理解为普通对象,为此目的尝试使用Doctrime ORM。我建立了一个使用Lumen和主义ORM的辅导员。
https://github.com/davists/Lumen-Doctrine-DDD-Generator
*对于acured perfomance analisys有cachegrind。
http://kcachegrind.sourceforge.net/html/Home.html
当我搬到Laravel 5时,我已经和所有这些东西搏斗了。那时候我决定改变我的方法( 这是艰难的决定 )。在这个过程中,我得出以下结论:
DB
每个查询都符合两个类别之一(我认为这是CQRS的一种形式):
3.1。 的 库 强> (命令):这些涉及改变状态(写入)以及需要在更改状态之前对对象进行水合并应用某些规则的情况(有时您需要执行一些读取以进行写入)(有时您还会执行批量写入和水合作用)可能效率不高,所以只需创建执行此操作的存储库方法)。所以我有一个名为“Domain”的文件夹(用于Domain Driven Design),里面有更多文件夹,每个文件夹代表我对业务领域的看法。每个实体我都有一个配对的存储库。这里的实体是一个类似于其他人可能称之为“模型”的类,它拥有属性并且具有帮助我保持属性有效或者对它们起作用的方法,这些方法最终将保留在存储库中。存储库是一个带有一堆方法的类,这些方法表示我需要做的与该实体相关的所有查询类型(即。 $repo->save() )。这些方法可以接受一些参数(允许在里面进行一些动态查询操作,但不要太多),在里面你会发现原始查询和一些代码来实现水合。您会发现存储库通常接受和/或返回实体。
$repo->save()
3.2。 的 查询 强> (a.k.a.screen?):我有一个名为“Queries”的文件夹,其中我有不同类的方法,里面有原始查询来执行显示工作。这些类只是帮助将事物分组,但与存储库不同(即它们不进行保湿,写入,返回实体等)。目标是将这些用于读取和大多数显示目的。
我成功地使用了DDD概念启发的这种方法。一旦您使用存储库方法,那么几乎不需要使用Eloquent IMHO。而且我发现我没有写出额外的东西(正如你在问题中提到的那样),同时仍然保持我的应用程序灵活,以便将来的更改。这是另一个 途径 来自一位工匠(虽然我不一定同意使用Doctrine ORM)。祝你好运,快乐的编码!