我对如何在Laravel控制器中实现和遵循SRP(单一责任原则(感到困惑。
假设我们有一个控制器,我们必须做这些事情:
例如
public function StorePost() {
// check user login()
//check number of current user Post count =>which must be less than 10
//store post
//send an email to user which your post has saved
//return =>api:json /web : redirect
}
我知道我可以在存储库中实现一些DB查询,但我不知道如何实现其他逻辑代码来实现SRP
此外,我知道有一个海曼方案可以实现这些目标,但我想自己实施它。
SRP在这种情况下,基本上意味着每个类和方法应该只负责一个行为/功能。经验法则是,一个类或方法应该只因一个原因而更改,如果它因多个原因更改,则需要将其分解为更小的部分。
- 您的
storePost
方法不应该检查用户登录,这应该在调用storePost
之前在其他地方处理。如果身份验证机制发生变化,比如从api令牌切换到json-web令牌或其他什么,则storePost
不应该发生变化。Laravel通过auth中间件在中间件级别实现了这一点 - 检查用户帖子计数,这可以在验证阶段进行检查。如果我们添加更多的验证逻辑,
storePost
不应该改变。在Laravel中,您可以使用FormValidation
- 对于存储post,控制器不需要知道如何调用DB,您可以使用模型类使用活动记录样式,或者如果您的用例需要,可以创建一个服务或存储库类。如果我们决定像NoSQL那样改变DB供应商,
storePost
就不应该改变 - 对于发送电子邮件,同样,控制器不需要知道如何发送电子邮件,比如主题/正文收件人是什么。如果我们需要更改电子邮件布局,
storePost
不应该更改。Laravel有Notification
- 为了将响应序列化为json,控制器不需要知道如何格式化响应。如果我们决定更新json的外观,
storePost
不应该改变。Laravel对此有API Resource
因此,在本例中,控制器方法的职责基本上是将所有这些粘合在一起。它基本上做你写下的事情,它只负责维护一步一步的行为,其他一切都委托给别人。如果行为发生变化,比如添加新的行为,比如通知所有追随者,storePost
就会发生变化。