如何在 Laravel 中实现单一职责

问题描述

我对如何在 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 将发生变化。