Skip to content

HTTP 请求

获取请求实例

通过 Facade

Request facade 将为您提供对当前绑定在容器中的请求的访问。例如:

php
$name = Request::input('name');

请记住,如果您在命名空间中,您需要在类文件的顶部使用 use Request; 语句导入 Request facade。

通过依赖注入

要通过依赖注入获取当前 HTTP 请求的实例,您应该在控制器构造函数或方法中类型提示该类。当前请求实例将由服务容器自动注入:

php
<?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');

		//
	}

}

如果您的控制器方法还期望从路由参数中获取输入,只需在其他依赖项之后列出您的路由参数:

php
<?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 动词,因为输入的访问方式对于所有动词都是相同的。

php
$name = Request::input('name');

如果输入值不存在则检索默认值

php
$name = Request::input('name', 'Sally');

确定输入值是否存在

php
if (Request::has('name'))
{
	//
}

获取请求的所有输入

php
$input = Request::all();

仅获取请求的一些输入

php
$input = Request::only('username', 'password');

$input = Request::except('credit_card');

在处理带有“数组”输入的表单时,您可以使用点符号访问数组:

php
$input = Request::input('products.0.name');

旧输入

Laravel 还允许您在下一个请求期间保留来自一个请求的输入。例如,您可能需要在检查表单验证错误后重新填充表单。

将输入闪存到会话

flash 方法会将当前输入闪存到会话,以便在用户的下一个请求中可用:

php
Request::flash();

仅将某些输入闪存到会话

php
Request::flashOnly('username', 'email');

Request::flashExcept('password');

闪存和重定向

由于您通常希望在重定向到上一页时闪存输入,您可以轻松地将输入闪存链接到重定向。

php
return redirect('form')->withInput();

return redirect('form')->withInput(Request::except('password'));

检索旧数据

要从上一个请求中检索闪存输入,请在 Request 实例上使用 old 方法。

php
$username = Request::old('username');

如果您在 Blade 模板中显示旧输入,使用 old 辅助函数更为方便:

php
{{ old('username') }}

Cookies

Laravel 框架创建的所有 cookies 都经过加密并带有身份验证代码签名,这意味着如果客户端更改了它们,它们将被视为无效。

php
$value = Request::cookie('name');

cookie 辅助函数作为生成新的 Symfony\Component\HttpFoundation\Cookie 实例的简单工厂。可以使用 withCookie 方法将 cookies 附加到 Response 实例:

php
$response = new Illuminate\Http\Response('Hello World');

$response->withCookie(cookie('name', 'value', $minutes));

“永久”实际上是指五年。

php
$response->withCookie(cookie()->forever('name', 'value'));

队列 Cookies

您还可以“队列”一个 cookie,以便在创建响应之前将其添加到传出的响应中:

php
<?php namespace App\Http\Controllers;

use Cookie;
use Illuminate\Routing\Controller;

class UserController extends Controller
{
	/**
	 * 更新资源
	 *
	 * @return Response
	 */
	 public function update()
	 {
	 	Cookie::queue('name', 'value');

	 	return response('Hello World');
	 }
}

文件

检索上传的文件

php
$file = Request::file('photo');

确定是否上传了文件

php
if (Request::hasFile('photo'))
{
	//
}

file 方法返回的对象是 Symfony\Component\HttpFoundation\File\UploadedFile 类的实例,该类扩展了 PHP 的 SplFileInfo 类,并提供了多种与文件交互的方法。

确定上传的文件是否有效

php
if (Request::file('photo')->isValid())
{
	//
}

移动上传的文件

php
Request::file('photo')->move($destinationPath);

Request::file('photo')->move($destinationPath, $fileName);

其他文件方法

UploadedFile 实例上还有多种其他方法。有关这些方法的更多信息,请查看类的 API 文档

其他请求信息

Request 类提供了许多方法来检查应用程序的 HTTP 请求,并扩展了 Symfony\Component\HttpFoundation\Request 类。以下是一些亮点。

检索请求 URI

php
$uri = Request::path();

确定请求是否使用 AJAX

php
if (Request::ajax())
{
	//
}

检索请求方法

php
$method = Request::method();

if (Request::isMethod('post'))
{
	//
}

确定请求路径是否匹配模式

php
if (Request::is('admin/*'))
{
	//
}

获取当前请求 URL

php
$url = Request::url();