Laravel通过Illuminate\Http\Request对象统一处理HTTP请求,封装GET、POST、文件上传等数据,提供request()助手函数和依赖注入两种方式获取请求数据,简化了对$_GET、$_POST等全局变量的手动解析。请求流程从public/index.php开始,经HTTP Kernel加载中间件,由路由器匹配路由并执行对应控制器方法。Request对象不仅作为数据容器,还提供input()、query()、post()、file()等方法智能读取数据,并支持文件上传处理,将$_FILES转化为UploadedFile对象,实现store()、isValid()等便捷操作。此外,Request具备判断请求类型(如ajax、pjax)、获取URL信息(url、fullUrl)、与Session和认证用户交互(user()、session())、数据验证(validate())及修改(merge、replace)等功能,内置CSRF防护与JSON自动解析,提升安全性与开发效率。其底层基于Symfony HttpFoundation组件,确保健壮性,使开发者能以面向对象方式处理请求,降低认知负担,提升代码可维护性。

Laravel处理请求的核心,说白了,就是把所有进来的HTTP信息,无论是GET参数、POST数据、文件上传,还是请求头和服务器变量,全都封装到一个
Illuminate\Http\Request
request()
Request
$_GET
$_POST
$_FILES
Laravel的请求处理流程,从
public/index.php
Illuminate\Http\Request
获取请求数据,主要有以下几种方式和常用方法:
使用request()
// 获取所有输入数据(GET, POST, JSON)
$allInput = request()->all();
// 获取特定字段,如果不存在可以提供默认值
$name = request()->input('name', 'Guest');
// 获取GET参数
$id = request()->query('id');
// 获取POST参数 (input() 通常更通用)
$email = request()->post('email');
// 检查字段是否存在
if (request()->has('password')) {
// ...
}通过依赖注入Request
handle
Illuminate\Http\Request
use Illuminate\Http\Request;
class UserController extends Controller
{
public function store(Request $request)
{
// 获取所有输入
$data = $request->all();
// 获取特定输入
$username = $request->input('username');
// 仅获取部分输入
$credentials = $request->only(['email', 'password']);
// 排除部分输入
$safeData = $request->except(['_token', '_method']);
// 获取文件
if ($request->hasFile('avatar')) {
$file = $request->file('avatar');
// ... 处理文件
}
// 获取请求头
$userAgent = $request->header('User-Agent');
// 获取服务器变量
$ipAddress = $request->server('REMOTE_ADDR');
// 判断请求方法
if ($request->isMethod('post')) {
// ...
}
// 判断是否是Ajax请求
if ($request->ajax()) {
// ...
}
// 验证请求数据
$request->validate([
'title' => 'required|max:255',
'body' => 'required',
]);
// ... 业务逻辑
}
}input()
query()
post()
我个人觉得,Laravel的
Request
$_GET
$_POST
$_FILES
它背后其实是继承了Symfony的
HttpFoundation\Request
比如,它会自动处理JSON请求体,我们不需要手动
json_decode
$_FILES
UploadedFile
Validator
处理文件上传,在传统的PHP开发中常常是一件让人头疼的事情,需要手动检查
$_FILES
Request
当你有一个
enctype="multipart/form-data"
type="file"
Request
Illuminate\Http\UploadedFile
$request->file('field_name')这个
UploadedFile
hasFile('field_name')isValid()
store('path/to/directory', 'disk_name')public
s3
storeAs('path/to/directory', 'filename.ext', 'disk_name')move('destination_path', 'filename.ext')getClientOriginalName()
getClientOriginalExtension()
getMimeType()
getSize()
一个简单的文件上传示例:
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage; // 通常会用到 Storage Facade
class AvatarController extends Controller
{
public function upload(Request $request)
{
// 首先,我们应该进行验证
$request->validate([
'avatar' => 'required|image|mimes:jpeg,png,jpg,gif|max:2048', // 2MB
]);
if ($request->hasFile('avatar') && $request->file('avatar')->isValid()) {
$path = $request->file('avatar')->store('avatars', 'public');
// 上面的 'avatars' 是存储在 public 磁盘下的目录
// $path 会是类似 'avatars/random_hash.jpg' 的路径
// 如果你想使用原始文件名(不推荐直接用,可能重名)
// $originalName = $request->file('avatar')->getClientOriginalName();
// $path = $request->file('avatar')->storeAs('avatars', $originalName, 'public');
// 记录用户头像路径到数据库等
// User::find(Auth::id())->update(['avatar_path' => $path]);
return back()->with('success', '头像上传成功!');
}
return back()->withErrors('头像上传失败,请重试。');
}
}通过
UploadedFile
除了获取各种请求数据和文件,
Request
input()
判断请求类型和特性:
$request->isMethod('post')$request->isMethod('get')$request->ajax()
X-Requested-With
$request->pjax()
$request->wantsJson()
Accept
$request->prefers(['text/html', 'application/json'])
获取URL信息:
$request->url()
$request->fullUrl()
$request->path()
/user/profile
$request->is('admin/*')$request->routeIs('admin.users.*')name()
与Session和认证用户交互:
$request->session()
$request->user()
请求数据修改与验证:
$request->merge(['key' => 'value'])
$request->replace(['key' => 'value'])
$request->validate([...])
Validator
举个例子,假设你有一个API接口,需要根据客户端是否期望JSON来返回不同格式的数据:
public function showProducts(Request $request)
{
$products = Product::all();
if ($request->wantsJson()) {
return response()->json($products);
}
return view('products.index', compact('products'));
}再比如,你可以在中间件中检查用户权限,并根据请求的URL模式来决定是否允许访问:
public function handle(Request $request, Closure $next)
{
if ($request->is('admin/*') && !$request->user()->isAdmin()) {
abort(403, 'Unauthorized action.');
}
return $next($request);
}这些“隐藏技能”让
Request
以上就是Laravel请求处理?请求数据如何获取?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号