绝大多数场景应直接用 $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()自动过滤掉未定义在规则里的键 - 错误信息默认存入 session,配合
withErrors()可在 Blade 中用$errors输出 - 不要手动写
if (! $validator->passes()) { ... },直接用fails()更语义清晰 - 规则字符串里写
nullable而非required_if,除非真有条件依赖;否则容易漏判空字符串或 0
什么时候必须写 FormRequest 类?
当验证逻辑开始复用、需要授权控制、或规则变得复杂(如自定义消息、条件验证、数据库唯一性检查),就该抽成 FormRequest。
- 运行
php artisan make:request StorePostRequest生成类 - 在
authorize()方法里写权限判断,返回false会直接 403,不用在控制器里再 check -
rules()方法里返回数组,和Validator::make()规则格式完全一致 - 控制器方法签名直接类型提示该类:
public function store(StorePostRequest $request),验证自动触发,失败时自动重定向并携带错误 - 注意:只有 HTTP 方法为
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' => '这个字段必须填']) - 若需在验证后做 DB 查询再决定是否允许提交(例如检查邮箱是否已被他人占用),
validate()不够用,得回退到Validator::make()或FormRequest - 别在同一个方法里混用
$request->validate()和Validator::make(),逻辑易混乱
$request->validate() 起手没问题;一旦发现要加授权、复用规则、或错误提示要精细控制,就该立刻切到 FormRequest —— 拖得越久,后期补授权和重构越疼。










