请求对象

获取请求

要通过依赖注入的方式来获取当前 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

你可以使用 urlfullUrl 方法去获取传入请求的完整 URLurl 方法返回不带有查询字符串的 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');
获取部分输入数据

如果你需要获取输入数据的子集,则可以用 onlyexcept 方法。这两个方法都接收 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

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 类的实例,该类继承了 PHPSplFileInfo 类的同时也提供了各种与文件交互的方法:

$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',
    ]);
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');
powered by GitbookEdit Time: 2023-04-08 10:28:32