首页 > 解决方案 > 如何在 laravel 中实现单一职责

问题描述

我对如何在 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 包可以实现这些,但我想自己实现它。

标签: laravelsolid-principlessingle-responsibility-principlelaravel-controller

解决方案


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

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

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


推荐阅读