你的 Controller 正在承担不该有的职责
打开你的 Controller。寻找一个 store 方法。
它有 40 行代码吗?你是否看到了一个巨大的验证块、好几个 if 语句、业务逻辑,最后才是一个 return 语句?
你的 Controller 正在做它不该做的工作。
Controller 只有一个职责。它接收请求,调用 Service 来解决问题,然后返回响应。它是服务员,而不是厨师。
当你把验证(validation)和授权(authorization)放在 Controller 内部时,它就会变得一团糟。最终你会得到 80 行没人敢碰的代码。
Laravel 有一个内置的解决方案:Form Requests。
一种常见的错误模式如下:
- 验证输入数据
- 检查用户权限
- 转换数据
- 执行业务逻辑
这违反了单一职责原则(Single Responsibility Principle)。一个类应该只有一个改变的原因。Controller 的改变是因为请求流程的变化,而不应该仅仅因为验证规则的变化而改变。
使用此命令来修复它:
php artisan make:request StorePostRequest
这会为你的请求逻辑创建一个专用文件。将以下三件事移入 Form Request 中:
- 授权:使用
authorize()方法来检查权限。 - 验证:使用
rules()方法来定义你的数据要求。 - 数据准备:使用
prepareForValidation()在验证之前清洗或格式化数据。
现在再次查看你的 Controller:
public function store(StorePostRequest $request)
{
$post = Post::create($request->validated());
return redirect()->route('posts.show', $post);
}
Controller 现在只有两行长。它又变回了服务员的角色。
Laravel 会在 Controller 方法启动之前自动运行授权和验证。如果验证失败,用户会立即收到错误。
请遵循以下准则:
- 如果验证逻辑很短且仅在单一位置使用,可以保持内联(inline)。
- 如果验证逻辑变得复杂、重复或包含授权逻辑,请使用 Form Request。
- 不要将业务逻辑放在 Form Request 中。请使用 Service 层来处理。
今天就去找找你最乱的那个 Controller。将验证逻辑提取到 Form Request 中。看着它变得简洁。
你见过最大的 store 方法有多长?在评论区告诉我吧。
Source: https://dev.to/denisgusto1/seu-controller-ta-fazendo-o-trabalho-do-form-request-e-ele-nao-devia-512o
