注入的一个 Illuminate\Http\Request 实例, 是 laravel 中最常用的收集和处理用户数据的工具.
tip: 你也可以使用 request() 全局帮助函数 and Request facade, 他们都会暴露一个 Illuminate Request 对象.
Route::post('form', function (Illuminate\Http\Request $request) {// $request->etc()});
表单数据
$request->All(): 获取所有参数(包括post 和 get)$request->except()和$request->only(): 排除和只添加$request->has(): 检查是否有参数$request->input('name', 'defaultValue'): 获取一个值$request->method(): 返回 http 动词$request->isMethod('post'): 检查是否是 post- array input
<!-- GET route form view at /employees/create -->
<form method="post" action="/employees/">
@csrf
<input type="text" name="employees[0][firstName]">
<input type="text" name="employees[0][lastName]">
<input type="text" name="employees[1][firstName]">
<input type="text" name="employees[1][lastName]">
<input type="submit">
</form>
// POST route at /employees
Route::post('employees', function (Request $request) {
$employeeZeroFirstName = $request->input('employees.0.firstName');
$allLastNames = $request->input('employees.*.lastName');
$employeeOne = $request->input('employees.1');
var_dump($employeeZeroFirstname, $allLastNames, $employeeOne);
});
json input和$raquest->json()
POST /post-route HTTP/1.1
Content-Type: application/json
{
"firstName": "Joe",
"lastName": "Schmoe",
"spouse": {
"firstName": "Jill",
"lastName":"Schmoe"
}
}
// input() 也可以处理 json 数据
Route::post('post-route', function (Request $request) {
$firstName = $request->input('firstName');
$spouseFirstname = $request->input('spouse.firstName');
});
// 但是如果正确设置 application/json 请求头的 post 数据, input()就处理不了, 这时候需要 json()
- 顺便说一句
// 以下都是等价的
request()->has(); // 全局函数形式
Illuminate\Support\Facades\Request::has(); // Facade 形式
$request->has(); // 注入实例形式
// 以下也等价
request('firstName');
request()->input('firstName')
url 参数
例如 “http://www.myapp.com/users/15/“ 有两个参数: users 和 15.
$request->segments(): 获取所有参数 并返回一个数组$request->segment($segmentId): 获取一个参数$segmentId是参数序号, 从1开始的( 即$request->segment(1)获取 ‘users’)- 路由参数直接会注入到控制器或闭包函数中 如下:
Route::get('users/{id}', function ($id) {
// If the user visits myapp.com/users/15/, $id will equal 15
});
上传文件
laravel 使用 $request->file($fileInputName) 方法接受上传的文件, 接受上传文件的输入框的名字作为参数, 返回一个 Symfony\Component\HttpFoundation\File\UploadedFile 实例.
<form method="post" enctype="multipart/form-data">
@csrf
<input type="text" name="name">
<input type="file" name="profile_picture">
<input type="submit">
</form>
$request->input('profile_picture') 将会返回 null ; 我们需要使用 $request->file('profile_picture')替代
Route::post('form', function (Request $request) {
var_dump($request->all());
});
// Output:
// [
// "_token" => "token here",
// "name" => "asdf",
// "profile_picture" => UploadedFile {},
// ]
Route::post('form', function (Request $request) {
if ($request->hasFile('profile_picture')) {
var_dump($request->file('profile_picture'));
}
});
// Output:
// UploadedFile (details)
校验上传
if ($request->hasFile('profile_picture') && $request->file('profile_picture')->isValid()) {
//
}
guessExtension()getMimeType()store($path, $storageDisk = default disk)storeAs($path, $newName, $storageDisk = default disk)storePublicly($path, $storageDisk = default disk)storePubliclyAs($path, $newName, $storageDisk = default disk)move($directory, $newName = null)getClientOriginalName()getClientOriginalExtension()getClientMimeType()guessClientExtension()getClientSize()getError()isValid()
常见流程
if ($request->hasFile('profile_picture')) {
// 自定义名字
// $path = $request->profile_picture->storeAs('profiles', 'newName', 's3');
$path = $request->profile_picture->store('profiles', 's3');
auth()->user()->profile_picture = $path;
auth()->user()->save();
}
