HTTP 请求
获取请求
要通过依赖注入的方式获取 HTTP 请求的实例,就必须在控制器的构造器或方法中,使用 Illuminate\Http\Request
类型提示。当前的请求实例便会自动由 服务容器注入:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
class UserController extends Controller
{
/**
* 保存新的用户。
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
$name = $request->input('name');
//
}
}
如果控制器方法也有输入数据是从路由参数传入的,只需将路由参数置于其它依赖之后。举例来说,如果你的路由是这样定义的:
Route::put('user/{id}', 'UserController@update');
只要像下方一样定义控制器方法,就可以使用 Illuminate\Http\Request
类型提示,同时获取到你的路由参数 id
:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
class UserController extends Controller
{
/**
* 更新指定的用户。
*
* @param Request $request
* @param int $id
* @return Response
*/
public function update(Request $request, $id)
{
//
}
}
基本请求信息
Illuminate\Http\Request
的实例提供了多种方法来用于检查应用程序的 HTTP 请求。Larevel 的 Illuminate\Http\Request
继承了 Symfony\Component\HttpFoundation\Request
类。下方是该类的几个有用的方法:
获取请求的 URI
path
方法会返回请求的 URI。所以,如果接收到的请求目标是 http://domain.com/foo/bar
,那么 path
方法就会返回 foo/bar
:
$uri = $request->path();
is
方法可以验证接收到的请求 URI 与指定的规则是否相匹配。使用此方法时你可以将 *
符号作为通配符:
if ($request->is('admin/*')) {
//
}
使用 url
方法,可以获取完整的网址:
$url = $request->url();
获取请求的方法
method
方法会返回此次请求的 HTTP 动作。也可以通过 isMethod
方法来验证 HTTP 动作和指定的字符串是否相匹配:
$method = $request->method();
if ($request->isMethod('post')) {
//
}
PSR-7 请求
PSR-7 标准制定的 HTTP 消息接口包含了请求及响应。如果你想获得一个 PSR-7 的请求实例,你就必须先安装几个函数库。Laravel 使用 Symfony 的 HTTP 消息桥接组件,将原 Laravel 的请求及响应转换至 PSR-7 所支持的实现:
composer require symfony/psr-http-message-bridge
composer require zendframework/zend-diactoros
安装完这些函数库后,就可以在路由或控制器中,简单的对请求类型使用类型提示来获取 PSR-7 的请求 :
use Psr\Http\Message\ServerRequestInterface;
Route::get('/', function (ServerRequestInterface $request) {
//
});
如果你从路由或控制器返回一个 PSR-7 的响应实例,那么它会被框架自动转换回 Laravel 的响应实例并显示。