laravel - 如何在 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 包可以实现这些,但我想自己实现它。
解决方案
在这种情况下, SRP基本上意味着每个类和方法应该只负责一个行为/功能。经验法则是一个类或方法应该只因为一个原因而改变,如果它因为多种原因而改变,它需要被分解成更小的部分。
- 您的
storePost
方法不应该检查用户登录,这应该在调用之前在其他地方处理storePost
。storePost
如果身份验证机制发生变化(例如从 api 令牌切换到 json Web 令牌或其他内容),则不应更改。Laravel 使用 auth 中间件在中间件级别执行此操作。 - 检查用户发帖数,这可以在验证阶段进行检查。
storePost
如果我们添加更多验证逻辑,则不应更改。在 Laravel 中,您可以使用FormValidation
它 - 为了存储帖子,控制器不需要知道如何调用数据库,您可以使用模型类使用活动记录样式,或者如果您的用例需要,也可以创建服务或存储库类。
storePost
如果我们决定像使用 NoSQL 一样更改数据库供应商,则不应更改。 - 对于发送电子邮件,控制器再次不需要知道如何发送电子邮件,例如主题/正文收件人是什么。
storePost
如果我们需要更改电子邮件布局,则不应更改。LaravelNotification
为此 - 为了将响应序列化为 json,控制器不需要知道如何格式化响应。如果我们决定更新 json 的外观,
storePost
不应该改变。Laravel 有API Resource
s
所以,最终在这个例子中,控制器方法的职责基本上是将所有这些粘合在一起。它基本上做你写下的事情,它只负责维护一步一步的行为,其他一切都委托给其他人。如果行为改变,比如添加新行为,例如通知所有关注者,storePost
将会改变。
推荐阅读
- java - 活动主题不变
- css - 如何同时转换多个元素的属性
- javascript - 如何转到 Epubjs 中的特定页面
- javascript - Flask:为什么在提交表单时不调用 AJAX?
- android - 重叠绘图
- azure-sql-database - 是否可以更改默认 ComputeModel 以使用 Azure SQL Server 创建数据库
- http - 当某个站点的 cookie 被删除后,如何使用 cookie 导航到该站点?
- java - 循环音频和输入对话框取消
- r - 使用 ggplot 复制空间点数据框 RGB 值的 R plot()
- c - 用户在单行中输入的每个字符的错误消息输出?