访问请求实例
在控制器中,获取当前 HTTP 请求实例,需要在构造函数或方法中,对 Illuminate\Http\Request 类进行依赖注入,这样当前请求实例会被服务容器自动注入:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
/**
* 存储新用户
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
$name = $request->input('name');
//
}
}
如果还期望在控制器方法中获取路由参数,只需要将路由参数置于其它依赖之后即可。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
/**
* 更新指定用户
*
* @param Request $request
* @param int $id
* @return Response
*/
public function update(Request $request, $id)
{
//
}
}
通过路由闭包访问请求实例
还可以在路由闭包中注入 Illuminate\Http\Request,在执行闭包函数的时候服务容器会自动注入输入请求:
use Illuminate\Http\Request;
Route::get('/', function (Request $request) {
//
});
Illuminate\Http\Request 继承自 Symfony\Component\HttpFoundation\Request 类,提供了多个方法来检测应用的 HTTP 请求,下面我们来演示其提供的一些获取请求路径和请求方式的方法。
获取请求路径
path 方法将会返回请求的路径信息,因此,如果请求的 URL 是 http://www.adm.devp/user/1 ,则 path 方法将会返回 user/1:
$path = $request->path();
is 方法允许你验证请求路径是否与给定模式匹配。该方法参数支持 * 通配符:
if($request->is('user/*')){
//
}
如果请求URL是 http://www.adm.devp/user/1 ,该方法会返回 true。
获取请求 URL
想要获取完整的 URL,而不仅仅是路径信息,可以使用请求实例提供的 url 或 fullUrl 方法, url 方法返回不带查询字符串的 URL,而 fullUrl 方法则包含查询字符串。
// 不包含查询字符串
$url = $request->url();
// 包含查询字符串
$url_with_query = $request->fullUrl();
获取请求方式
method 方法将会返回 HTTP 请求方式。你还可以使用 isMethod 方法来验证 HTTP 请求方式是否匹配给定字符串。
$method = $request->method(); // GET/POST
if($request->isMethod('post')){
// true or false
}
PSR-7 请求
PSR-7 标准指定了 HTTP 消息接口,包括请求和响应。如果你想要获取遵循 PSR-7 标准的请求实例而不是 Laravel 请求实例,首先需要安装一些库。Laravel 可以使用 Symfony HTTP Message Bridge 组件将典型的 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 响应实例并显示出来。