HTTP 请求

获取请求实例

通过 Facade

Request facade 允许你访问当前绑定容器的请求。例如:

  1. $name = Request::input('name');

切记,如果你在一个命名空间中,你必须导入 Request facade,接着在类的上方声明 use Request;。

通过依赖注入

要通过依赖注入的方式取得 HTTP 请求的实例,你必须在控制器中的构造函数或方法对该类使用类型提示。当前请求的实例将会自动由 服务容器 注入:

  1. <?php namespace App\Http\Controllers;
  2. use Illuminate\Http\Request;
  3. use App\Http\Controllers\Controller;
  4. class UserController extends Controller {
  5. /**
  6. * Store a new user.
  7. *
  8. * @param Request $request
  9. * @return Response
  10. */
  11. public function store(Request $request)
  12. {
  13. $name = $request->input('name');
  14. //
  15. }
  16. }

如果你的控制器也有从路由参数传入的输入数据,只需要将路由参数置于其他依赖之后:

  1. <?php namespace App\Http\Controllers;
  2. use Illuminate\Http\Request;
  3. use App\Http\Controllers\Controller;
  4. class UserController extends Controller {
  5. /**
  6. * Store a new user.
  7. *
  8. * @param Request $request
  9. * @param int $id
  10. * @return Response
  11. */
  12. public function update(Request $request, $id)
  13. {
  14. //
  15. }
  16. }

取得输入数据

取得特定输入数据

你可以通过 Illuminate\Http\Request 的实例,经由几个简洁的方法取得所有的用户输入数据。不需要担心发出请求时使用的 HTTP 请求,取得输入数据的方式都是相同的。

  1. $name = Request::input('name');

取得特定输入数据,若没有则取得默认值

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

确认是否有输入数据

  1. if (Request::has('name')) {
  2. //
  3. }

取得所有发出请求时传入的输入数据

  1. $input = Request::all();

取得部分发出请求时传入的输入数据

  1. $input = Request::only('username', 'password');
  2. $input = Request::except('credit_card');

如果是「数组」形式的输入数据,可以使用「点」语法取得数组:

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

旧输入数据

Note: 你需要开启 会话 功能才能使用.

Lumen 可以让你保留这次的输入数据,直到下一次请求发送前。例如,你可能需要在表单验证失败后重新填入表单值。

将输入数据存成一次性 Session

flash 方法会将当前的输入数据存进 session 中,所以下次用户发出请求时可以使用保存的数据:

  1. Request::flash();

将部分输入数据存成一次性 Session

  1. Request::flashOnly('username', 'email');
  2. Request::flashExcept('password');

快闪及重定向

你很可能常常需要在重定向至前一页,并将输入数据存成一次性 Session。只要在重定向方法后的链式调用方法中传入输入数据,就能简单地完成。

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

取得旧输入数据

若想要取得前一次请求所保存的一次性 Session,你可以使用 Request 实例中的 old 方法。

  1. $username = Request::old('username');

如果你想在 Blade 模板显示旧输入数据,可以使用更加方便的辅助方法 old

  1. {{ old('username') }}

Cookies

如果你想让所有的 Cookie 都加密的话, 你需要把 bootstrap/app.phpEncryptCookies 中间件去掉注释. Lumen 所建立的 cookie 会加密并且加上认证记号,这代表着被用户擅自更改的 cookie 会失效。

  1. $value = Request::cookie('name');

辅助方法 cookie 提供一个简易的工厂方法来产生新的 Symfony\Component\HttpFoundation\Cookie 实例。可以在 Response 实例之后连接 withCookie 方法带入 cookie 至响应:

  1. $response = new Illuminate\Http\Response('Hello World');
  2. $response->withCookie(cookie('name', 'value', $minutes));

虽然说是「永远」,但真正的意思是五年。

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

预存 Cookies

Note: 你需要在 bootstrap/app.php 文件里面注释掉 AddQueuedCookiesToResponse 这一行来使用此功能.

你甚至可以在未响应输出前, 提前预存 Cookie:

  1. <?php namespace App\Http\Controllers;
  2. use Cookie;
  3. use App\Http\Controllers\Controller;
  4. class UserController extends Controller
  5. {
  6. /**
  7. * Update a resource
  8. *
  9. * @return Response
  10. */
  11. public function update()
  12. {
  13. Cookie::queue('name', 'value');
  14. return response('Hello World');
  15. }
  16. }

上传文件

取得上传文件

  1. $file = Request::file('photo');

确认文件是否有上传

  1. if (Request::hasFile('photo')) {
  2. //
  3. }

file 方法返回的对象是 Symfony\Component\HttpFoundation\File\UploadedFile 的实例,UploadedFile 继承了 PHP 的 SplFileInfo 类并且提供了很多和文件交互的方法。

确认上传的文件是否有效

  1. if (Request::file('photo')->isValid()) {
  2. //
  3. }

移动上传的文件

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

其他上传文件的方法

UploadedFile 的实例还有许多可用的方法,可以至该对象的 API 文档 了解有关这些方法的详细信息。

其他的请求信息

Request 类提供很多方法检查 HTTP 请求,它继承了 Symfony\Component\HttpFoundation\Request 类,下面是一些使用方式。

取得请求 URI

  1. $uri = Request::path();

取得请求方法

  1. $method = Request::method();
  2. if (Request::isMethod('post')) {
  3. //
  4. }

确认请求路径是否符合特定格式

  1. if (Request::is('admin/*')) {
  2. //
  3. }

取得请求 URL

  1. $url = Request::url();