我认为,只要遵循SOLID原则,您提出的所有模式/架构都是非常有用的。
对于在何处添加逻辑,我认为参考“ 单一责任原则”很重要。另外,我的回答还认为您正在从事中型/大型项目。如果是在页面上扔东西,请忘记此答案并将其全部添加到控制器或模型中。
简短的答案是:对您(使用服务)有意义。
长答案:
控制器:控制器的职责是什么?当然,您可以将所有逻辑放在控制器中,但这是控制器的责任吗?我不这么认为。
对我来说,控制器必须接收请求并返回数据,而这里并不是放置验证,调用db方法等的地方。
模型:这是添加逻辑的好地方,例如在用户注册或更新帖子的投票计数时发送欢迎电子邮件吗?如果您需要从代码中的其他位置发送相同的电子邮件怎么办?您是否创建静态方法?如果该电子邮件需要其他模型的信息怎么办?
我认为模型应该代表一个实体。随着Laravel,我只用模型类添加之类的东西fillable
,guarded
,table
和关系(这是因为我使用Repository模式,否则模型本来也有save
,update
,find
,等方法)。
存储库(Repository Pattern):一开始我对此很困惑。而且,像您一样,我认为“好吧,我使用MySQL就是这样。”。
但是,我已经平衡了使用存储库模式的利弊,现在我使用它。我认为现在,此时此刻,我只需要使用MySQL。但是,如果从现在起三年后,我需要更改为MongoDB之类的东西,那么大部分工作就完成了。全部以一个额外的接口和一个为代价$app->bind(«interface», «repository»)
。
事件(观察者模式):事件对于可以在任何给定时间在任何类上抛出的事件很有用。例如,考虑向用户发送通知。在需要时,您可以触发事件以在应用程序的任何类中发送通知。然后,您可以拥有一个类似的类UserNotificationEvents
来处理所有触发的用户通知事件。
服务:到目前为止,您可以选择向控制器或模型添加逻辑。对我来说,在Services中添加逻辑是很有意义的。面对现实,服务是类的一个奇特的名字。在您的应用程序中,您可以拥有尽可能多的类。
举个例子:不久前,我开发了类似Google Forms的东西。我开始与一个CustomFormService
并结束了CustomFormService
,CustomFormRender
,CustomFieldService
,CustomFieldRender
,CustomAnswerService
和CustomAnswerRender
。为什么?因为这对我来说很有意义。如果您与团队合作,则应将逻辑放在适合团队的位置。
使用服务vs控制器/模型的优点是您不受单个控制器或单个模型的约束。您可以根据应用程序的设计和需求创建任意数量的服务。除此之外,在应用程序的任何类中调用服务的优势。
这很长,但是我想向您展示如何构造应用程序:
app/
controllers/
MyCompany/
Composers/
Exceptions/
Models/
Observers/
Sanitizers/
ServiceProviders/
Services/
Validators/
views
(...)
我将每个文件夹用于特定功能。例如,Validators
目录包含一个BaseValidator
类,负责根据$rules
和$messages
特定验证器(通常每个模型一个)来处理验证。我可以很容易地将此代码放入Service中,但是对于我来说,为此有一个特定的文件夹是有意义的,即使它仅在服务中使用(目前)。
我建议您阅读以下文章,因为它们可能会对您有所帮助:
Dayle Rees(CodeBright的作者)打破常规:尽管我做了一些修改以满足自己的需求,但我还是把这一切放在一起了。
使用 Chris Goosey的“ 存储库和服务”在Laravel中解耦代码:这篇文章很好地解释了什么是服务和存储库模式以及它们如何组合在一起。
Laracasts还具有简化的存储库和单一职责的存储库,它们是带有实际示例的良好资源(即使您必须付费)。