【问题标题】:how to implement Single Responsibility in laravel如何在 laravel 中实现单一职责
【发布时间】:2021-07-04 20:08:34
【问题描述】:

我很困惑如何在 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
    }

我知道我可以在存储库中实现一些数据库查询,但我不知道如何实现我的其他逻辑代码以实现 SRP

另外,我知道有一个 Heyman 包可以实现这些,但我想自己实现它。

【问题讨论】:

  • Repository 是 Laravel 中的一种反模式。

标签: laravel solid-principles single-responsibility-principle laravel-controller


【解决方案1】:

SRP 在这种情况下基本上意味着每个类和方法应该只负责一个行为/功能。经验法则是一个类或方法应该只因一个原因而改变,如果它因多种原因而改变,则需要将其分解为更小的部分。

  • 您的storePost 方法不应该检查用户登录,这应该在调用storePost 之前在其他地方处理。 storePost 如果身份验证机制发生变化(例如从 api 令牌切换到 json Web 令牌或其他),则不应更改。 Laravel 使用 auth 中间件在中间件​​级别执行此操作。
  • 检查用户发帖数,这可以在验证阶段进行检查。如果我们添加更多验证逻辑,storePost 不应更改。在 Laravel 中,您可以为此使用 FormValidation
  • 为了存储帖子,控制器不需要知道如何调用数据库,您可以使用模型类使用活动记录样式,或者如果您的用例需要,也可以创建一个服务或存储库类。 storePost 不应该改变,如果我们决定像使用 NoSQL 一样改变数据库供应商。
  • 对于发送电子邮件,控制器不需要知道如何发送电子邮件,例如主题/正文收件人是什么。如果我们需要更改电子邮件布局,storePost 不应更改。 Laravel 为此提供了 Notification
  • 为了将响应序列化为 json,控制器不需要知道如何格式化响应。如果我们决定更新 json 的外观,storePost 不应该改变。 Laravel 为此提供了 API Resources

因此,最终在这个示例中,控制器方法的职责基本上是将所有这些粘合在一起。它基本上做你写下的事情,它只负责维护一步一步的行为,其他一切都委托给其他人。如果行为发生变化,例如添加新行为,例如通知所有关注者,storePost 将发生变化。

【讨论】:

  • ''如果行为发生变化,比如添加新的行为例如通知所有关注者,storePost 会发生变化。'' => 不违反开闭原则?
  • 我想使用solid原理但是我没有找到一个支持hole SOLID的好例子,除了我找到了这个包github.com/imanghafoori1/laravel-heyman,可以给我一个链接吗?
  • @Abbas in this case/context, ''如果行为改变,比如添加新行为,例如通知所有关注者,storePost 将改变。'',这个改变不会修改现有的角色或接口,它在不改变当前行为或界面的情况下扩展当前行为。
  • 顺便说一句,heyman 包不是关于 SOLID 或 SRP 等的,它是使用声明式的方式来做基本的操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
相关资源
最近更新 更多