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 请求。Laravel 的 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 方法:
$url = $request->url();检索请求方法
method 方法将返回请求的 HTTP 动词。您还可以使用 isMethod 方法来验证 HTTP 动词是否与给定字符串匹配:
$method = $request->method();
if ($request->isMethod('post')) {
//
}PSR-7 请求
PSR-7 标准指定了 HTTP 消息的接口,包括请求和响应。如果您想获取 PSR-7 请求的实例,首先需要安装一些库。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 响应实例并由框架显示。
检索输入
检索输入值
使用一些简单的方法,您可以从 Illuminate\Http\Request 实例中访问所有用户输入。您无需担心请求使用的 HTTP 动词,因为输入的访问方式对于所有动词都是相同的:
$name = $request->input('name');或者,您可以使用 Illuminate\Http\Request 实例的属性来访问用户输入。例如,如果您的应用程序的表单包含一个 name 字段,您可以像这样访问发布字段的值:
$name = $request->name;您可以将默认值作为第二个参数传递给 input 方法。如果请求中不存在请求的输入值,则返回此值:
$name = $request->input('name', 'Sally');在处理带有数组输入的表单时,您可以使用“点”符号来访问数组:
$input = $request->input('products.0.name');确定输入值是否存在
要确定请求中是否存在某个值,您可以使用 has 方法。has 方法返回 true,如果值存在且不是空字符串:
if ($request->has('name')) {
//
}检索所有输入数据
您还可以使用 all 方法将所有输入数据作为 array 检索:
$input = $request->all();检索部分输入数据
如果您需要检索输入数据的子集,可以使用 only 和 except 方法。这两个方法都接受一个 array 或动态参数列表:
$input = $request->only(['username', 'password']);
$input = $request->only('username', 'password');
$input = $request->except(['credit_card']);
$input = $request->except('credit_card');旧输入
Laravel 允许您在下一个请求期间保留来自一个请求的输入。此功能对于在检测到验证错误后重新填充表单特别有用。但是,如果您使用 Laravel 的验证服务,则不太可能需要手动使用这些方法,因为 Laravel 的一些内置验证功能会自动调用它们。
将输入闪存到会话
Illuminate\Http\Request 实例上的 flash 方法会将当前输入闪存到会话,以便在用户的下一个请求期间可用:
$request->flash();您还可以使用 flashOnly 和 flashExcept 方法将请求数据的子集闪存到会话中:
$request->flashOnly('username', 'email');
$request->flashExcept('password');将输入闪存到会话然后重定向
由于您通常希望在重定向到上一页时闪存输入,您可以轻松地将输入闪存链接到重定向,使用 withInput 方法:
return redirect('form')->withInput();
return redirect('form')->withInput($request->except('password'));检索旧数据
要从上一个请求中检索闪存输入,请在 Request 实例上使用 old 方法。old 方法提供了一个方便的助手,用于从会话中提取闪存输入数据:
$username = $request->old('username');Laravel 还提供了一个全局 old 助手函数。如果您在Blade 模板中显示旧输入,使用 old 助手更为方便:
{{ old('username') }}Cookies
从请求中检索 Cookies
Laravel 框架创建的所有 cookies 都经过加密并带有身份验证代码签名,这意味着如果客户端更改了它们,它们将被视为无效。要从请求中检索 cookie 值,您可以在 Illuminate\Http\Request 实例上使用 cookie 方法:
$value = $request->cookie('name');将新 Cookie 附加到响应
Laravel 提供了一个全局 cookie 助手函数,作为生成新 Symfony\Component\HttpFoundation\Cookie 实例的简单工厂。可以使用 withCookie 方法将 cookies 附加到 Illuminate\Http\Response 实例:
$response = new Illuminate\Http\Response('Hello World');
$response->withCookie(cookie('name', 'value', $minutes));
return $response;要创建一个持续五年的长效 cookie,您可以通过首先调用不带参数的 cookie 助手,然后将 forever 方法链接到返回的 cookie 工厂来使用 cookie 工厂的 forever 方法:
$response->withCookie(cookie()->forever('name', 'value'));文件
检索上传的文件
您可以使用 file 方法访问包含在 Illuminate\Http\Request 实例中的上传文件。file 方法返回的对象是 Symfony\Component\HttpFoundation\File\UploadedFile 类的实例,该类扩展了 PHP 的 SplFileInfo 类,并提供了多种方法来与文件交互:
$file = $request->file('photo');验证文件存在
您还可以使用 hasFile 方法确定请求中是否存在文件:
if ($request->hasFile('photo')) {
//
}验证上传成功
除了检查文件是否存在,您还可以通过 isValid 方法验证上传文件时没有问题:
if ($request->file('photo')->isValid()) {
//
}移动上传的文件
要将上传的文件移动到新位置,您应该使用 move 方法。此方法会将文件从其临时上传位置(由您的 PHP 配置确定)移动到您选择的更永久的目的地:
$request->file('photo')->move($destinationPath);
$request->file('photo')->move($destinationPath, $fileName);其他文件方法
UploadedFile 实例上还有多种其他方法。有关这些方法的更多信息,请查看类的 API 文档。