HTTP 辅助与 Query 增强(Phase 3)
25.1 中断请求 abort / abort_if / abort_unless
抛出 Mtphp\Exception\HttpException,由 App 统一渲染为对应状态码的错误响应(404/403/401/500…)。
abort(404); // 抛出 404
abort(403, '无权限'); // 带消息
abort_if($user === null, 401, '请登录'); // 条件成立才抛
abort_unless($logged, 401, '请登录'); // 条件不成立才抛
25.2 重定向 redirect / back / with
redirect($url) 返回 302 响应(Location 头);back() 取 HTTP_REFERER 回落到 /;with($k,$v) 经 Session 落地一次性 flash(下次请求用 session()->getFlash($k) 读取)。
return redirect('/login'); // 直接跳转
return redirect('/login', 301); // 永久跳转
return redirect('/login')->with('msg', '请先登录'); // 带一次性提示
return back(); // 返回上一页
with()依赖StartSession中间件注入的会话;未启用会话时静默降级(不报错)。App已新增setSession()/session()访问器供其取用。
25.3 请求校验 Request::validate()
控制器内一行完成输入校验;失败自动抛出 ValidationException,由 App 渲染为 422 JSON {message, errors},无需手动捕获。通过则返回白名单过滤后的合法数据。
$data = $request->validate([
'name' => 'required|max:50',
'email' => 'required|email',
'age' => 'integer|min:0',
]);
// 失败 → 422 {"message":"校验失败","errors":{"email":["email 格式不正确"]}}
// 成功 → $data 仅含 name/email/age(自动剔除多余字段)
$request->all() 合并了 query + post + JSON 体(后者覆盖前者),作为校验数据源。校验规则与 Mtphp\Validation\Validator 完全复用(含 extend() 自定义规则)。
25.4 Query 聚合 sum / avg / max / min
DB::table('order')->sum('amount'); // float
DB::table('order')->avg('amount'); // float
DB::table('order')->max('amount'); // mixed(按列类型)
DB::table('order')->min('amount'); // mixed
25.5 查询谓词增强 distinct / whereNotIn / whereBetween / orderByDesc
DB::table('user')->distinct()->select('city')->get(); // 去重
DB::table('user')->whereNotIn('id', [1,2,3])->get(); // 不在集合
DB::table('order')->whereBetween('created_at', [$a, $b])->get(); // 闭区间
DB::table('user')->orderByDesc('id')->get(); // 降序简写
25.6 字段自增自减 increment / decrement
生成 UPDATE ... SET col = col ± ? WHERE ...;强制要求带 where 条件,避免无意识全表更新。
DB::table('user')->where('id', 1)->increment('score', 5); // +5
DB::table('user')->where('id', 1)->decrement('score', 1); // -1
// DB::table('user')->increment('score'); // 无 where → 抛 RuntimeException
以上全部能力均配套零依赖单测(见
tests/,php tests/run.php一键跑全量,全绿)。