
绝大多数场景应直接用 $request->input() 取参,推荐首选;简单校验用 Validator::make(),单次验证用 $request->validate(),复杂/复用场景才需 FormRequest 类。
$request->input() 拿参数,别先写 Request 类绝大多数场景下,你不需要立刻写一个独立的 FormRequest 类。Laravel 的控制器里直接注入 Illuminate\Http\Request 实例,用 input()、query()、post() 就能取到数据,干净利落。
$request->input('name'):统一取 POST/GET/JSON 所有来源的字段(推荐首选)$request->query('page'):只取 URL 查询参数(如 ?page=2)$request->post('email'):仅限传统表单 POST(不包含 JSON 或 PUT/PATCH 请求体)input() 默认返回 null;可传第二个参数设默认值:$request->input('limit', 10)
$request->input('user.name') 可取 {"user": {"name": "Alice"}} 中的值Validator::make() 适合简单校验或动态规则当你只需要几条规则、或规则需运行时拼接(比如根据用户角色切换必填项),直接调用门面比写 FormRequest 更轻量。
use Illuminate\Support\Facades\Validator;
$validator = Validator::make($request->all(), [
'email' => 'required|email',
'age' => 'nullable|integer|min:18',
]);
if ($validator->fails()) {
return redirect()->back()->withErrors($validator)->withInput();
}
$data = $validator->validated(); // ✅ 只返回通过验证的字段
$request->all() 会传入所有输入,包括 _token、_method 等 Laravel 自带字段;validated() 自动过滤掉未定义在规则里的键
withErrors() 可在 Blade 中用 $errors 输出if (! $validator->passes()) { ... },直接用 fails() 更语义清晰nullable 而非 required_if,除非真有条件依赖;否则容易漏判空字符串或 0FormRequest 类?当验证逻辑开始复用、需要授权控制、或规则变得复杂(如自定义消息、条件验证、数据库唯一性检查),就该抽成 FormRequest。
php artisan make:request StorePostRequest 生成类authorize() 方法里写权限判断,返回 false 会直接 403,不用在控制器里再 checkrules() 方法里返回数组,和 Validator::make() 规则格式完全一致public function store(StorePostRequest $request),验证自动触发,失败时自动重定向并携带错误POST、PUT、PATCH、DELETE 时,FormRequest 才会自动校验;GET 请求不会触发,得手动调用 $request->validate()
$request->validate() 是最简快路径,但别滥用它本质是 Validator::make() + 自动抛出异常 + 自动响应,适合单次、无复用、无授权逻辑的验证。
public function update(Request $request, $id)
{
$validated = $request->validate([
'title' => 'required|string|max:255',
'body' => 'required|string',
]);
// $validated 只含 title 和 body,且已通过验证
}
authorize(),也不支持自定义错误消息(除非传第二个参数)$request->validate([...], ['required' => '这个字段必须填'])
validate() 不够用,得回退到 Validator::make() 或 FormRequest
$request->validate() 和 Validator::make(),逻辑易混乱$request->validate() 起手没问题;一旦发现要加授权、复用规则、或错误提示要精细控制,就该立刻切到 FormRequest —— 拖得越久,后期补授权和重构越疼。