比方说,每当我执行 CRUD 操作或以特定方式修改关系时,我还想执行其他操作。例如,每当有人发表了一篇文章,我也想保存一些东西到一个表格进行分析。也许不是最好的例子,但总的来说有很多这样的“分组”功能。
通常我看到这种类型的逻辑放入控制器。这一切都很好,直到你想在许多地方重现这一功能。当您开始使用局部数据集、创建 API 和生成虚拟内容时,保持数据的干燥就成了一个问题。
我看到的管理方法是事件、存储库、库和向模型中添加。以下是我对每个问题的理解:
服务: 大多数人可能会把这段代码放在这里。我对服务的主要看法是,有时候很难在服务中找到特定的功能,我觉得当人们专注于使用 Eloquent 时,他们就会被遗忘。当我只能调用 $post->is_published = 1
时,我怎么知道我需要在库中调用方法 publishPost()
呢?
我认为唯一可行的条件是,只使用服务(理想情况下,让所有控制器以某种方式都无法访问 Eloquent)。
最终,如果您的请求通常遵循您的模型结构,那么这似乎只会创建一堆额外的不必要的文件。
存储库: 据我所知,这基本上就像一个服务,但是有一个接口,所以你可以在 ORM 之间切换,这是我不需要的。
Events: 从某种意义上说,我认为这是最优雅的系统,因为您知道模型事件总是在 Eloquent 方法上调用,所以您可以像通常那样编写控制器。我可以看到这些变得混乱,但是,如果任何人有大型项目使用事件的关键耦合的例子,我希望看到它。
模型: 传统上,我拥有执行 CRUD 并处理关键耦合的类。这实际上使事情变得很简单,因为您知道 CRUD + 周围的所有功能都在那里。
很简单,但是在 MVC 架构中这不是我通常看到的。从某种意义上说,尽管我更喜欢这种服务,因为它更容易找到,而且要跟踪的文件更少。不过可能会有点杂乱无章。我想听听这种方法的缺点,以及为什么大多数人似乎不这样做。
每种方法的优缺点是什么? 我是否遗漏了什么?