问题描述
我对如何在 Laravel 控制器中实现以及如何遵循 SRP(单一职责原则)感到非常困惑。
假设我们有一个控制器,我们必须做这些事情:
例如
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
char str[20],str2[20];
int length;
cout<<"Enter the string\n";
cin>>str;
length=strlen(str);
str2=strrev(str);
if(str==str2)
{
cout<<"palindrome";
}
else{
cout<<"Not a palindrome";
}
return 1;
}
我知道我可以在存储库中实现一些数据库查询,但我不知道如何实现我的其他逻辑代码来实现 SRP
另外,我知道有一个 heyman 包可以实现这些,但我想自己实现它。
解决方法
SRP 在这个上下文中基本上意味着每个类和方法应该只负责一个行为/特性。经验法则是一个类或方法应该只因一个原因而改变,如果它因多种原因而改变,则需要将其分解为更小的部分。
- 您的
storePost
方法不应该费心检查用户登录,这应该在调用storePost
之前在别处处理。如果身份验证机制发生变化,例如从 api 令牌切换到 json Web 令牌或其他什么,storePost
不应改变。 Laravel 使用 auth 中间件在中间件级别执行此操作。 - 检查用户发帖数,这可以在验证阶段进行检查。如果我们添加更多验证逻辑,
storePost
不应更改。在 Laravel 中,您可以使用FormValidation
来实现 - 为了存储帖子,控制器不需要知道如何调用数据库,您可以使用模型类使用活动记录样式,或者如果您的用例需要,可以创建服务或存储库类。如果我们决定像使用 NoSQL 那样改变数据库供应商,
storePost
不应该改变。 - 对于发送电子邮件,控制器再次不需要知道如何发送电子邮件,例如主题/正文收件人是什么。如果我们需要更改电子邮件布局,
storePost
不应更改。 Laravel 有Notification
用于此 - 为了将响应序列化为 json,控制器不需要知道如何格式化响应。如果我们决定更新 json 的外观,
storePost
不应更改。 Laravel 有API Resource
用于此
所以,最终在这个例子中,控制器方法的职责基本上是将所有这些粘合在一起。它基本上做你写下的,它只负责维护循序渐进的行为,其他一切都委托给别人。如果行为发生变化,例如添加新行为,例如通知所有关注者,storePost
将发生变化。