14.1 Request 请求

1、使用方法很简单,在 Controller控制器 中,引入 Request ,并在控制器的方法中,注入Request 对象即可。

如:使用下面命令,创建控制类UserController:

  1. php artisan make:controller UserController

这时,系统会自动在控制类中添加如下引用:

use Illuminate\Http\Request;

然后编写路由,编写方法,即可进行测试。

Route::get('user/index', 'UserController@index');

2、使用 input() 方法获取 http 请求的数据:

class UserController extends Controller
{
    //方法会自动得到Request 对象,这个就是注入
    public function index(Request $request){
        //input 的方法可以获取http 请求的数据
        return $request->input('name');
    }
}

这时,访问链接:http://127.0.0.1:8000/user/index?name=ZhangSan ,即可返回字符串 ZhangSan

当然,可增加多个参数,如:http://127.0.0.1:8000/user/index?name=ZhangSan&id=10001

return $request->input('id').$request->input('name');

返回结果:10001ZhangSan

可以为请求设置默认值,即请求的参数不存在,则使用默认值:

//参数2 为默认值
$request->input('name', 'no name');

还有一种动态方式获取:

//动态方式获取
$request->name;

3、使用 all() 方法,可以获取所有 url 传递过来的参数

return $request->all();
return $request->input();//这个也可以实现同样效果

如访问:http://127.0.0.1:8000/user/index?name=ZhangSan&id=10001&age=1024

返回 JSON结果

{"name":"ZhangSan","id":"10001","age":"1024"}

4、路由自带参数时,可以通过第二,第三参数接受;

如路由修改为:

Route::get('user/{id}/{code}', 'UserController@index2');

则控制器的方法修改为:

public function index2(Request $request, $id, $code)
{
   //内容
}

这里要注意:

路由参数顺序和控制器的参数顺序要一致

5、路由区域,也支持闭包注入Request

Route::get('/user', function (Request $request) {
    return $request->all();
});

6、使用 path() 方法,可以得到当前的uri 路径;

注:以下几条,都使用链接:http://127.0.0.1:8000/user/index?name=ZhangSan&id=10001&age=1024 进行演示

return $request->path();

结果:user/index

7、使用 is() 方法,可以判断当前的uri 是否匹配;

//是否是user/*的uri,返回布尔值
return $request->is('user/*');

结果:1

8、使用 url()fullUrl() 得到 url 地址,带参数和不带参数区别;

return $request->url();
return $request->fullUrl();

结果依次为:

http://127.0.0.1:8000/user/index
http://127.0.0.1:8000/user/index?age=1024&id=10001&name=ZhangSan

9、使用 isMethod() 来判断 HTTP 请求的方式,getpost 等等;

return $request->isMethod('post');
return $request->isMethod('GET');

结果依次为:

(为false,不显示结果)
1

14.2 常用的其他请求方法

1、数组的接受方式

前端的表单如下:

<form action="/user" method="get">
    <input type="checkbox" name="select[][a]" value="1">
    <input type="checkbox" name="select[][b]" value="2">
    <input type="checkbox" name="select[][c]" value="3">
    <button type="submit">发送</button>
</form>

这时,控制类的方法中,获取请求数据的方式:

return $request->input('select.1.b');//输出结果为2

如果是JSON 数据,也是这么弄;

2、Request 对象 的其他实用方法:

//返回布尔值
$request->boolean('name');

//返回IP
$request->ip();

//只接受固定参数
$request->only(['age', 'gender']);

//排除不要的参数
$request->except(['name']);

//判断参数是否存在
return $request->has('name');

//判断参数是否全部存在
return $request->has(['name', 'age']);

//判断参数只有一个存在,就返回true
return $request->hasAny(['name', 'age']);

//判断参数存在,并且不为空
return $request->filled('name');

//判断参数不存在(为空也不行)
return $request->missing('name');

3、除了在方法中引入Request,还可以使用助手函数request():

return request()->input();

14.3 依赖注入

已知在 DataController中,有方法:

public function read($id)
{
    return ['id' => $id];
}

如果我们想在 UserController 中,使用该方法,原始的做法如下:

$data = new DataController();
return $data->read(10);

执行结果为:

{"id":10}

直接使用依赖注入,可以直接使用:

public function index(Request $request, DataController $data)
{
    return $data->read(10);
}

以上。