1. 基本操作

重新创建一个路由 my2.php 用于路由测试,然后创建一个新的控制器 my/UserController

1.1 new Request()

控制器

  1. <?php
  2. namespace App\Http\Controllers\my;
  3. use App\Http\Controllers\Controller;
  4. use Illuminate\Http\Request;
  5. class UserController extends Controller
  6. {
  7. // 1. 方式1 new
  8. public function fun1()
  9. {
  10. $request = new Request();
  11. dump($request);
  12. }
  13. }
  1. <br />**路由**
  1. <?php
  2. Route::namespace('my')->group(function () {
  3. Route::get('fun1', 'UserController@fun1');
  4. });

测试
image.png


1.2 构造器注入

控制器

  1. <?php
  2. namespace App\Http\Controllers\my;
  3. use App\Http\Controllers\Controller;
  4. use Illuminate\Http\Request;
  5. class UserController extends Controller
  6. {
  7. private $request;
  8. // 2. 方式2 构造函数注入
  9. public function __construct()
  10. {
  11. $this->request = new Request();
  12. }
  13. public function fun2()
  14. {
  15. dump($this->request);
  16. }
  17. }

路由

  1. <?php
  2. Route::namespace('my')->group(function () {
  3. Route::get('fun2', 'UserController@fun2');
  4. });

测试
image.png


1.3 请求路径相关

  • Request->path():返回额是请求的路径
  • Request->url():不含查询字符串的URL
  • Request->fullUrl():完整的URL地址含有查询字符串

路由

  1. <?php
  2. Route::namespace('my')->group(function () {
  3. Route::get('fun3', 'UserController@fun3');
  4. });

控制器

  1. <?php
  2. namespace App\Http\Controllers\my;
  3. use App\Http\Controllers\Controller;
  4. use Illuminate\Http\Request;
  5. class UserController extends Controller
  6. {
  7. // 依赖注入的方式
  8. public function fun3(Request $request)
  9. {
  10. dump($request->path());
  11. dump($request->url());
  12. dump($request->fullUrl());
  13. }
  14. }

测试
1.png


1.4 获取和判断请求的方法

  • $request->method()
    • 获取http请求的方法
    • 返回值:返回大写请求的方式 String。
  • $request->isMethod()
    • 传递参数:请求的方式,String
    • 返回值:boolean
    • return $this->getMethod() === strtoupper($method);

控制器

  1. <?php
  2. // 依赖注入控制器
  3. public function fun4(Request $req)
  4. {
  5. $method = $req->method();
  6. echo $method . "\r";
  7. if($req->isMethod('get')) {
  8. return '这是get请求';
  9. }
  10. if($req->isMethod('post')) {
  11. return '这是post请求';
  12. }
  13. if($req->isMethod('put')) {
  14. return '这是put请求';
  15. }
  16. if($req->isMethod('delete')) {
  17. return '这是delete请求';
  18. }
  19. }

路由

  1. <?php
  2. /**
  3. * 请求中的方法
  4. */
  5. Route::namespace('my')->group(function () {
  6. Route::get('fun4', 'UserController@fun4');
  7. Route::post('fun4', 'UserController@fun4');
  8. Route::delete('fun4', 'UserController@fun4');
  9. Route::put('fun4', 'UserController@fun4');
  10. });

测试

HTTP 请求 POSTMAN 测试图片
get get.png
post post.png
put put.png
delete delete.png

1.5 获取输入的数据

all()

  • 获取全部的数据,返回的是一个数组
  • 哪怕是指定一个key,返回的也是一个数组

控制器

  1. <?php
  2. // 获取输入的数据
  3. public function fun5(Request $req)
  4. {
  5. echo "all() \r";
  6. var_dump($req->all());
  7. }

路由

  1. <?php
  2. /**
  3. * all()
  4. */
  5. Route::namespace('my')->group(function () {
  6. Route::post('fun5', 'UserController@fun5');
  7. });

测试返回全部数据
image.png

限制只获取name**
image.png

input()

  • 可以指定返回其中的一个数据
    • 默认不加参数
      • 返回的是一个数组,和all()一样
    • 添加参数name
      • 返回指定的参数,数据类型是这个数据的数据类型
    • 添加参数可能不存在的默认参数
      • 如果不存在,第二个参数就会作为默认值

image.png

当处理包含数组的表单时,可以使用 「.」 运算符来访问数组的数据:

  1. <?php
  2. $name = $request->input('products.0.name');
  3. $names = $request->input('products.*.name');

query()

input 方法可以从整个请求体中获取数据(包括查询字符串), 而 query 方法仅仅从查询字符串中获取输入值:用法上input()和query() 差不多

  1. <?php
  2. $name = $request->query('name');
  3. $name = $request->query('name', 'Helen');
  4. $query = $request->query();

通过动态属性获取输入

当使用动态属性时,Laravel 将会先从请求体中查找参数。如果该值不存在,则从路由参数中查找。

  1. <?php
  2. $name = $request->name;

2. 获取数据的其他方式

获取 JSON 输入

当向应用传递 JSON 请求时,只要将请求头中的 Content-Type 设置为 application/json 后你便可以使用 input 方法来获取 JSON 数据。你也可以使用「.」语法获取 JSON 数组内容:

  1. <?php
  2. $name = $request->input('user.name');

获取输入中的布尔值

当处理诸如 checkbox 类的 HTML 元素时,你的应用可能获取到以字符串形式传递的 “真假值”,例如 “true” 或者 “on”。为了方便,你可以使用 bool 方法来将这些值转换布尔类型。boolean 方法将会把 1, 「1」, true, 「true」, 「on」, 和 「yes」返回为 true。而其他值将会返回 false:

  1. <?php
  2. $archived = $request->boolean('archived');

获取部分输入数据

如果需要获取输入数据的子集,你可以使用 onlyexcept 方法。它们接受单个 array 或者动态参数列表:

  1. <?php
  2. $input = $request->only(['username', 'password']);
  3. $input = $request->only('username', 'password');
  4. $input = $request->except(['credit_card']);
  5. $input = $request->except('credit_card');

判断输入值是否存在

你可以使用 has 来判断当前请求中是否含有指定的值。如果请求中存在该值则 has 方法将会返回 true

  1. <?php
  2. if ($request->has('name')) {
  3. //
  4. }

当给定一个数组时,has 将会判断指定的值是否全部存在:

  1. <?php
  2. if ($request->has(['name', 'email'])) {
  3. //
  4. }

hasAny 方法将会在指定的值有一个存在的情况下返回 true

  1. <?php
  2. if ($request->hasAny(['name', 'email'])) {
  3. //
  4. }

3. 旧数据

Laravel 允许你在两次请求之间保持数据。这个特性在有效性校验出错后重新填充表单时非常有用。不过,如果你使用 Laravel 自带的 特性验证 , 不需要自己手动调用这些方法因为一些 Laravel 内置的验证功能会自动调用它们。

将输入数据闪存到 Session

Illuminate\Http\Request 类的 flash 方法可以把当前的输入闪存到 session,因此在用户向应用发起的下一次请求时它们仍然可用:

  1. <?php
  2. $request->flash();

你也可以使用 flashOnly 方法和 flashExcept 方法将请求数据的子集传送给 session。这些方法在将密码之类的敏感数据排除在 session 外的情况下挺实用的:

  1. <?php
  2. $request->flashOnly(['username', 'email']);
  3. $request->flashExcept('password');

闪存数据并跳转

如果你需要经常保存输入到 session 然后重定向到之前的页面,可以通过在跳转函数后链式调用 withInput 方法轻易地实现::

  1. <?php
  2. return redirect('form')->withInput();
  3. return redirect('form')->withInput(
  4. $request->except('password')
  5. );

获取旧数据

若要获取上一次请求所保存的旧数据,可以在 Request 的实例上使用 old 方法。old 方法会从 [session] 取出之前被闪存的输入数据 (/docs/laravel/7.x/session):

  1. <?php
  2. $username = $request->old('username');

Laravel 也提供了全局辅助函数 old。如果你要在 Blade 模板 中显示旧的输入,使用 old 辅助函数将会更加方便。如果给定字段没有旧的输入,则会返回 null

  1. <input type="text" name="username" value="{{ old('username') }}">