1. 基本操作
重新创建一个路由 my2.php
用于路由测试,然后创建一个新的控制器 my/UserController
1.1 new Request()
控制器
<?php
namespace App\Http\Controllers\my;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class UserController extends Controller
{
// 1. 方式1 new
public function fun1()
{
$request = new Request();
dump($request);
}
}
<br />**路由**
<?php
Route::namespace('my')->group(function () {
Route::get('fun1', 'UserController@fun1');
});
测试
1.2 构造器注入
控制器
<?php
namespace App\Http\Controllers\my;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class UserController extends Controller
{
private $request;
// 2. 方式2 构造函数注入
public function __construct()
{
$this->request = new Request();
}
public function fun2()
{
dump($this->request);
}
}
路由
<?php
Route::namespace('my')->group(function () {
Route::get('fun2', 'UserController@fun2');
});
测试
1.3 请求路径相关
- Request->path():返回额是请求的路径
- Request->url():不含查询字符串的URL
- Request->fullUrl():完整的URL地址含有查询字符串
路由
<?php
Route::namespace('my')->group(function () {
Route::get('fun3', 'UserController@fun3');
});
控制器
<?php
namespace App\Http\Controllers\my;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class UserController extends Controller
{
// 依赖注入的方式
public function fun3(Request $request)
{
dump($request->path());
dump($request->url());
dump($request->fullUrl());
}
}
测试
1.4 获取和判断请求的方法
- $request->method()
- 获取http请求的方法
- 返回值:返回大写请求的方式 String。
- $request->isMethod()
- 传递参数:请求的方式,String
- 返回值:boolean
return $this->getMethod() === strtoupper($method);
控制器
<?php
// 依赖注入控制器
public function fun4(Request $req)
{
$method = $req->method();
echo $method . "\r";
if($req->isMethod('get')) {
return '这是get请求';
}
if($req->isMethod('post')) {
return '这是post请求';
}
if($req->isMethod('put')) {
return '这是put请求';
}
if($req->isMethod('delete')) {
return '这是delete请求';
}
}
路由
<?php
/**
* 请求中的方法
*/
Route::namespace('my')->group(function () {
Route::get('fun4', 'UserController@fun4');
Route::post('fun4', 'UserController@fun4');
Route::delete('fun4', 'UserController@fun4');
Route::put('fun4', 'UserController@fun4');
});
测试
HTTP 请求 | POSTMAN 测试图片 |
---|---|
get | |
post | |
put | |
delete |
1.5 获取输入的数据
all()
- 获取全部的数据,返回的是一个数组
- 哪怕是指定一个key,返回的也是一个数组
控制器
<?php
// 获取输入的数据
public function fun5(Request $req)
{
echo "all() \r";
var_dump($req->all());
}
路由
<?php
/**
* all()
*/
Route::namespace('my')->group(function () {
Route::post('fun5', 'UserController@fun5');
});
测试返回全部数据
限制只获取name**
input()
- 可以指定返回其中的一个数据
- 默认不加参数
- 返回的是一个数组,和all()一样
- 添加参数name
- 返回指定的参数,数据类型是这个数据的数据类型
- 添加参数可能不存在的默认参数
- 如果不存在,第二个参数就会作为默认值
当处理包含数组的表单时,可以使用 「.」 运算符来访问数组的数据:
<?php
$name = $request->input('products.0.name');
$names = $request->input('products.*.name');
query()
input
方法可以从整个请求体中获取数据(包括查询字符串), 而 query
方法仅仅从查询字符串中获取输入值:用法上input()和query() 差不多
<?php
$name = $request->query('name');
$name = $request->query('name', 'Helen');
$query = $request->query();
通过动态属性获取输入
当使用动态属性时,Laravel 将会先从请求体中查找参数。如果该值不存在,则从路由参数中查找。
<?php
$name = $request->name;
2. 获取数据的其他方式
获取 JSON 输入
当向应用传递 JSON 请求时,只要将请求头中的 Content-Type 设置为 application/json 后你便可以使用 input 方法来获取 JSON 数据。你也可以使用「.」语法获取 JSON 数组内容:
<?php
$name = $request->input('user.name');
获取输入中的布尔值
当处理诸如 checkbox 类的 HTML 元素时,你的应用可能获取到以字符串形式传递的 “真假值”,例如 “true” 或者 “on”。为了方便,你可以使用 bool 方法来将这些值转换布尔类型。boolean 方法将会把 1, 「1」, true, 「true」, 「on」, 和 「yes」返回为 true。而其他值将会返回 false:
<?php
$archived = $request->boolean('archived');
获取部分输入数据
如果需要获取输入数据的子集,你可以使用 only 或 except 方法。它们接受单个 array 或者动态参数列表:
<?php
$input = $request->only(['username', 'password']);
$input = $request->only('username', 'password');
$input = $request->except(['credit_card']);
$input = $request->except('credit_card');
判断输入值是否存在
你可以使用 has
来判断当前请求中是否含有指定的值。如果请求中存在该值则 has
方法将会返回 true
:
<?php
if ($request->has('name')) {
//
}
当给定一个数组时,has
将会判断指定的值是否全部存在:
<?php
if ($request->has(['name', 'email'])) {
//
}
hasAny
方法将会在指定的值有一个存在的情况下返回 true
:
<?php
if ($request->hasAny(['name', 'email'])) {
//
}
3. 旧数据
Laravel 允许你在两次请求之间保持数据。这个特性在有效性校验出错后重新填充表单时非常有用。不过,如果你使用 Laravel 自带的 特性验证 , 不需要自己手动调用这些方法因为一些 Laravel 内置的验证功能会自动调用它们。
将输入数据闪存到 Session
Illuminate\Http\Request
类的 flash
方法可以把当前的输入闪存到 session,因此在用户向应用发起的下一次请求时它们仍然可用:
<?php
$request->flash();
你也可以使用 flashOnly
方法和 flashExcept
方法将请求数据的子集传送给 session。这些方法在将密码之类的敏感数据排除在 session 外的情况下挺实用的:
<?php
$request->flashOnly(['username', 'email']);
$request->flashExcept('password');
闪存数据并跳转
如果你需要经常保存输入到 session 然后重定向到之前的页面,可以通过在跳转函数后链式调用 withInput
方法轻易地实现::
<?php
return redirect('form')->withInput();
return redirect('form')->withInput(
$request->except('password')
);
获取旧数据
若要获取上一次请求所保存的旧数据,可以在 Request 的实例上使用 old 方法。old 方法会从 [session] 取出之前被闪存的输入数据 (/docs/laravel/7.x/session):
<?php
$username = $request->old('username');
Laravel 也提供了全局辅助函数 old
。如果你要在 Blade 模板 中显示旧的输入,使用 old
辅助函数将会更加方便。如果给定字段没有旧的输入,则会返回 null
:
<input type="text" name="username" value="{{ old('username') }}">