Laravel怎么获取请求参数Request_Laravel表单数据接收与验证器Validator使用【步骤】

10次阅读

绝大多数场景应直接用 $request->input() 取参,推荐首选;简单校验用 Validator::make(),单次验证用 $request->validate(),复杂/复用场景才需 FormRequest 类。

Laravel怎么获取请求参数Request_Laravel表单数据接收与验证器Validator使用【步骤】

直接用 $request->input() 拿参数,别先写 Request

绝大多数场景下,你不需要立刻写一个独立的 FormRequest 类。laravel 的控制器里直接注入 IlluminatehttpRequest 实例,用 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 IlluminateSupportFacadesValidator;  $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 方法为 POSTPUTPATCHdelete 时,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(),逻辑易混乱

实际项目里,80% 的表单用 $request->validate() 起手没问题;一旦发现要加授权、复用规则、或错误提示要精细控制,就该立刻切到 FormRequest —— 拖得越久,后期补授权和重构越疼。

text=ZqhQzanResources