你的 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