1. 获取请求信息的三种方式
Laravel 中获取用户请求信息有三种方式
- 注入 Illuminate\Http\Request 对象
- Request facade
- request() 助手函数
1.1 注入 Illuminate\Http\Request 对象
// 注入 Illuminate\Http\Request 对象
Route::post('form', function(Illuminate\Http\Request $request){
// 这样就注入成功了 ,然后就可以使用 $request 的各种成员来获取请求信息了
$request->input('title');
});
1.2 Request facade
// 如果要使用 facade ,必须导入完整的 facade 路径
use Illuminate\Support\facades\Request;
// 然后就能用了 ,跟 Illuminate\Http\Request 都差不多
Request::input('title');
1.3 request() 助手函数
// 使用全局助手函数就更方便了 ,直接用就好了
request()->input('title');
// 还有一个默认的规则 ,当传递一个参数时 request('title') 是 request()->input('title') 的快捷方式
request('title');
2. Illuminate\Http\Request 成员
提前说明一下继承关系
// Laravel 的 Illuminate\Http\Request 继承自 Symfony 框架的 Symfony\Component\HttpFoundation\Request
Illuminate\Http\Request extends Symfony\Component\HttpFoundation\Request;
2.1 获取请求参数的成员
成员 |
说明 |
示例 |
all() |
获取所有请求参数 |
$request->all() |
except() |
返回值与 all() 相同 ,但可以设置要排除的字段 ,比如 _token() |
$request->except('_token') |
only() |
返回值与 all() 相同 ,但可以手动指定获取哪些字段 |
$request->only(['firstName', 'lastName']) |
input() |
input() 与 only() 类似 ,但只能获取单个字段的值 |
$request->input('firstName') |
query() |
仅从查询字符串中获取参数值 |
$request->query('queryName', 'default') |
2.2 检测请求信息的成员
成员 |
说明 |
示例 |
has() |
检测请求字段是否存在 ,如果 key 存在并且为空 ,has() 会返回 false |
$request->has(['name', 'email']) |
exists() |
检测请求字段是否存在 ,如果 key 存在就算是空的 ,exists() 也返回 true |
$request->exists('firstName') |
is(...$patterns) |
如果当前 URI 与给定的正则表达式匹配返回 true |
- |
routeIs(...$patterns) |
如果当前路由名称与给定的正则表达式匹配返回 true |
- |
fullUrlIs(...$patterns) |
如果当前的 URL 与给定正则表达式匹配返回 true |
- |
ajax() |
如果是 AJAX 请求返回 true |
- |
pjax() |
如果是 PJAX 请求返回 true |
- |
secure() |
如果是 HTTPS 请求返回 true |
- |
isMethod($method) |
如果是给定的请求类型返回 true |
$request->isMethod('POST') |
2.3 上传文件相关的成员
成员 |
说明 |
示例 |
file() |
获取上传文件信息 ,返回 Symfony\Component\HttpFoundation\File\UploadedFile 实例 |
$request->file('profile_picture') |
hasFile() |
如果请求有上传文件 ,返回 true |
$request->hasFile('profile_picture') |
2.4 访问 URL 相关的成员
成员 |
说明 |
示例 |
root() |
返回应用程序的根 URL |
http://testl.lo |
url() |
获取请求的 URL ,不包含查询字符串 |
http://testl.lo/recipse |
fullUrl() |
获取请求的 URL ,包含查询字符串 |
http://testl.lo/recipse?a=b |
fullUrlWithQuery(array $query) |
根据完整的 URL 和传入的查询字符串返回一个新的 URL |
$request->fullUrlWithQuery(['a' => 'b']) |
path() |
获取请求的路径信息 |
- |
segments() |
返回所有的 URI 片段组成的数组 ,不包含域名 |
$request->segments() |
segment(default = null) |
返回指定的 URI 片段 ,路径索引是基于 1 的 |
$request->segment(1) |
2.5 操作请求信息的成员
成员 |
说明 |
示例 |
merge(array $input) |
将新的请求参数合并到当前请求参数中 |
- |
replace(array $input) |
替换当前请求参数( 会完全覆盖 ) |
- |
2.6 其他成员
成员 |
说明 |
示例 |
method() |
返回请求的类型 |
POST 、GET |
ip() |
返回客户端 IP |
- |
ips() |
返回客户端 IP ,数组 |
- |
userAgent() |
返回 User-Agent |
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36 |
fingerprint() |
返回对当前路由 、域名 、URI 、IP 进行 sha1 计算后的散列值 |
f93ae561bed07f6e902ebab927e59489c9f70934 |
instance() |
返回当前对象 |
- |
3. 访问数组输入
Laravel 为访问数组类型的输入数据提供了 "." 语法
<form method="post" action="/post-route">
{{ csrf_field() }}
<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]" />
</form>
Route::post('/post-route', function(Request $request){
// 假如表单填写为 张 、三 、李 、四
$request->input('employees.0.firstName'); // '张'
$request->input('employees.*.lastName'); // ['三', '四']
$request->input('employees.1'); // ['firstName' => '张', 'lastName' => '三']
})
网友评论