请求对象
获取请求
要通过依赖注入的方式来获取当前 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');
//
}
}
依赖注入 & 路由参数
如果控制器方法要从路由参数中获取数据,则应在其他依赖项之后列出路由参数。例如,如果你的路由是这样定义的:
Route::put('user/{id}', 'UserController@update');
如下所示使用提示类 Illuminate\Http\Request
,就可以在控制器方法中获得路由参数 id
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
/**
* 更新某个用户
*
* @param Request $request
* @param string $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
类。 以下是该类的一些重要用法:
获取请求路径
path
方法返回请求的路径信息。也就是说,如果传入的请求的目标地址是 http://domain.com/foo/bar
,那么 path
将会返回 foo/bar
:
$uri = $request->path();
is
方法可以验证传入的请求路径和指定规则是否匹配。使用这个方法的时,你也可以传递一个 *
字符作为通配符:
if ($request->is('admin/*')) {
//
}
获取请求的 URL
你可以使用 url
或 fullUrl
方法去获取传入请求的完整 URL
。url
方法返回不带有查询字符串的 URL
,而 fullUrl
方法的返回值包含查询字符串:
// 没有查询字符串...
$url = $request->url();
// 使用查询字符串...
$url = $request->fullUrl();
获取请求方法
对于传入的请求 method
方法将返回 HTTP
的请求方式。你也可以使用 isMethod
方法去验证 HTTP
的请求方式与指定规则是否相配:
$method = $request->method();
if ($request->isMethod('post')) {
//
}
获取输入
获取所有输入数据
你可以使用 all
方法以 array
形式获取到所有输入数据:
$input = $request->all();
获取指定输入值
使用几种简单的方法(不需要特别指定哪个 HTTP 动作),就可以访问 Illuminate\Http\Request
实例中所有的用户输入。也就是说无论是什么样的 HTTP 动作,input
方法都可以被用来获取用户输入数据:
$name = $request->input('name');
你可以给 input
方法的第二个参数传入一个默认值。如果请求的输入值不存在请求上,就返回默认值:
$name = $request->input('name', 'Sally');
如果传输表单数据中包含「数组」形式的数据,那么可以使用「点」式语法来获取数组:
$name = $request->input('products.0.name');
$names = $request->input('products.*.name');
从查询字符串获取输入
使用 input
方法可以从整个请求中获取输入数据(包括查询字符串),而 query
方法可以只从查询字符串中获取输入数据:
$name = $request->query('name');
如果请求的查询字符串数据不存在,则将返回这个方法的第二个参数:
$name = $request->query('name', 'Helen');
你可以不提供参数调用 query
方法来以关联数组的形式检索所有查询字符串值:
$query = $request->query();
通过动态属性获取输入
你也可以通过 Illuminate\Http\Request
实例的动态属性来获取用户输入。例如,如果你应用的表单中包含 name
字段,那么可以像这样访问该字段的值:
$name = $request->name;
Laravel 在处理动态属性的优先级是,先在请求的数据中查找,如果没有,再到路由参数中查找。
获取 JSON 输入信息
如果发送到应用程序的请求数据是 JSON,只要请求的 Content-Type
标头正确设置为 application/json
,就可以通过 input
方法访问 JSON
数据。你甚至可以使用 「点」式语法来读取 JSON
数组:
$name = $request->input('user.name');
获取部分输入数据
如果你需要获取输入数据的子集,则可以用 only
和 except
方法。这两个方法都接收 array
或动态列表作为参数:
$input = $request->only(['username', 'password']);
$input = $request->only('username', 'password');
$input = $request->except(['credit_card']);
$input = $request->except('credit_card');
only
方法会返回所有你指定的键值对,但不会返回请求中不存在的键值对。
确定是否存在输入值
要判断请求是否存在某个值,可以使用 has
方法。如果请求中存在该值,has
方法就会返回 true
:
if ($request->has('name')) {
//
}
当提供一个数组作为参数时,has
方法将确定是否存在数组中所有给定的值:
if ($request->has(['name', 'email'])) {
//
}
如果你想确定请求中是否存在值并且不为空,可以使用 filled
方法:
if ($request->filled('name')) {
//
}
Cookies
从请求中获取 Cookie
Laravel
框架创建的每个 cookie
都会被加密并使用验证码进行签名,这意味着如果客户端更改了它们,便视为无效。若要从请求中获取 cookie
值,你可以在 Illuminate\Http\Request
实例上使用 cookie
方法:
$value = $request->cookie('name');
或者,您可以使用 Cookie Facade
来访问 cookie
的值:
$value = Cookie::get('name');
文件
获取上传文件
你可以使用 file
方法或使用动态属性从 Illuminate\Http\Request
实例中访问上传的文件。该 file
方法返回一个 Illuminate\Http\UploadedFile
类的实例,该类继承了 PHP
的 SplFileInfo
类的同时也提供了各种与文件交互的方法:
$file = $request->file('photo');
$file = $request->photo;
你可以使用 hasFile
方法确认请求中是否存在文件:
if ($request->hasFile('photo')) {
//
}
验证成功上传
除了检查上传的文件是否存在外,你也可以通过 isValid
方法验证上传的文件是否有效:
if ($request->file('photo')->isValid()) {
//
}
文件路径 & 扩展名
UploadedFile
类还包含访问文件的完整路径及其扩展名方法。extension
方法会根据文件内容判断文件的扩展名。该扩展名可能会和客户端提供的扩展名不同:
$path = $request->photo->path();
$extension = $request->photo->extension();
响应对象
返回字符串或者数组
Route::get('/', function () {
return 'Hello World';
});
Route::get('/', function () {
return [1, 2, 3];
});
响应对象
一般来说,你不会只从路由行为返回简单的字符串或数组。你也许会返回完整的 Illuminate\Http\Response
实例或视图
返回完整的 Response
实例允许你自定义响应的 HTTP
状态码和响应头信息。Response
实例继承自 Symfony\Component\HttpFoundation\Response
类,该类提供了各种构建 HTTP
响应的方法:
Route::get('home', function () {
return response('Hello World', 200)
->header('Content-Type', 'text/plain');
});
为响应增加头信息
大部分的响应方法都是可链式调用的,使得创建响应实例的过程更具可读性。例如,你可以在响应返回给用户前使用 header
方法为其添加一系列的头信息:
return response($content)
->header('Content-Type', $type)
->header('X-Header-One', 'Header Value')
->header('X-Header-Two', 'Header Value');
或者,你可以使用 withHeaders
方法来指定要添加到响应的头信息数组:
return response($content)
->withHeaders([
'Content-Type' => $type,
'X-Header-One' => 'Header Value',
'X-Header-Two' => 'Header Value',
]);
为响应增加 Cookie
return response($content)
->header('Content-Type', $type)
->cookie('name', 'value', $minutes);
重定向
重定向响应是 Illuminate\Http\RedirectResponse
类的实例,并且包含用户需要重定向至另一个 URL
所需的头信息。Laravel
提供了几种方法用于生成 RedirectResponse
实例。其中最简单的方法是使用全局辅助函数 redirect
:
Route::get('dashboard', function () {
return redirect('home/dashboard');
});
有时候你可能希望将用户重定向到之前的位置,比如提交的表单无效时。这时你可以使用全局辅助函数 back
来执行此操作。由于这个功能利用了 Session
,请确保调用 back
函数的路由使用 web
中间件组或所有 Session
中间件:
Route::post('user/profile', function () {
// Validate the request...
return back()->withInput();
});
重定向至命名路由
当你不带参数调用辅助函数 redirect
时,会返回 Illuminate\Routing\Redirector
实例。这个实例允许你调用 Redirector
上的任何方法。例如为命名路由生成 RedirectResponse
,可以使用 route
方法:
return redirect()->route('login');
如果你的路由有参数,你可以把它们作为 route
方法的第二个参数来传递:
// 对于具有以下 URI 的路由: profile/{id}
return redirect()->route('profile', ['id' => 1]);
重定向至控制器行为
return redirect()->action('HomeController@index');
如果你的控制器路由需要参数,你可以将它们作为第二个参数传递给 action
方法:
return redirect()->action(
'UserController@profile', ['id' => 1]
);
重定向到外部域
return redirect()->away('https://www.google.com');