ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] # 请求 ## 请求对象 ### 依赖注入 & 路由参数 在控制器上引入`Illuminate\Http\Request`类, 传入的请求实例将会由 [服务容器] 自动注入 ``` // 路由定义 Route::put('user/{id}', 'UserController@update'); <?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) { // } } ``` ### 通过闭包路由获取参数 ``` use Illuminate\Http\Request; Route::get('/', function (Request $request) { // }); ``` ### 获取请求路径 ``` // 若请求路径 http://domain.com/foo/bar, path 方法返回 foo/bar $uri = $request->path(); // is 可以验证传入的请求路径是否与给定的模式匹配 if ($request->is('admin/*')) { // } ``` ### 获取请求 URL ``` $url = $request->url(); // 不附带查询串... $url = $request->fullUrl(); // 附带查询串... ``` ### 获取请求 Method ``` // method 方法返回请求的 HTTP 动作 $method = $request->method(); if ($request->isMethod('post')) { // } ``` ### PSR-7 请求 ``` // 用 PSR-7 请求代替 Laravel 请求,需要先安装扩展库 $ composer require symfony/psr-http-message-bridge $ composer require zendframework/zend-diactoros // 通过在路由闭包或控制器方法中的请求接口类型提示来获取 PSR-7 请求 use Psr\Http\Message\ServerRequestInterface; Route::get('/', function (ServerRequestInterface $request) { // }); ``` >[info] 提示:如果从路由或控制器返回 PSR-7 响应实例,框架会自动将其转换回 Laravel 响应实例并显示。 ## 输入的裁剪和标准化 >[success] 应用的全局中间件堆栈中包含了 TrimStrings 和 ConvertEmptyStringsToNull 中间件,用来格式化请求数据,trim()、替换空为 null。不需要可以在 App\Http\Kernel 类的 $middleware 属性删除。 ## 请求信息 ``` // 获取所有的请求数据 $input = $request->all(); // input 获取所有http方法的请求数据 $name = $request->input('name'); $name = $request->input('name', 'Sally'); // 设置默认值 $name = $request->input('products.0.name'); // 获取数组参数 $names = $request->input('products.*.name'); // 获取数组参数 $input = $request->input(); // 获取所有请求数据的关联数组 // query 从查询串中获取输入数据 $name = $request->query('name'); $name = $request->query('name', 'Helen'); // 设置默认值 $query = $request->query(); // 获取所有查询数据的关联数组 // 通过动态属性获取输入 // 先在请求载体中查找参数的值,如果不存在,则在路由参数中搜索 $name = $request->name; // 获取 JSON 输入,请求的 Content-Type 头设置为 application/json $name = $request->input('user.name'); // 获取部分输入数据 $input = $request->only(['username', 'password']); $input = $request->only('username', 'password'); $input = $request->except(['credit_card']); $input = $request->except('credit_card'); ``` >[info] 提示:`only`方法返回请求中的全部键值对;但是它不返回请求中不存在的键值对。 ### 判断输入值是否存在 ``` if ($request->has('name')) { // 判定请求中是否存在指定的值 } if ($request->has(['name', 'email'])) { // 判断在请求中,指定的值是否全部存在 } if ($request->filled('name')) { // 判断一个值在请求中是否存在,并且不为空 } ``` ### 将输入数据传送到 Session ``` // 将输入数据传送到 Session,等待后续操作使用 $request->flash(); $request->flashOnly(['username', 'email']); // 只保留 username、email $request->flashExcept('password'); // 排除 password ``` ### 传送数据至 session 并跳转 ``` return redirect('form')->withInput(); return redirect('form')->withInput( $request->except('password') ); ``` ### 获取旧数据 ``` $username = $request->old('username'); // Blade模板显示旧数据 <input type="text" name="username" value="{{ old('username') }}"> ``` ### Cookies ``` // 获取 Cookies $value = $request->cookie('name'); $value = Cookie::get('name'); // Cookie facade 访问 cookie 值 // 设置 Cookies ,名称、值、过期时间,与`setcookie`方法的参数类似 return response('Hello World')->cookie( 'name', 'value', $minutes [, $path, $domain, $secure, $httpOnly] ); // Cookie 队列,`queue`方法接受一个`Cookie`实例或者创建实例所需的参数 Cookie::queue(Cookie::make('name', 'value', $minutes)); Cookie::queue('name', 'value', $minutes); // 生成 Cookie 实例 $cookie = cookie('name', 'value', $minutes); return response('Hello World')->cookie($cookie); ``` ## 文件 ``` // 获取上传的文件 $file = $request->file('photo'); // 返回 Illuminate\Http\UploadedFile 实例 $file = $request->photo; if ($request->hasFile('photo')) { // 判断请求中是否存在指定文件 } if ($request->file('photo')->isValid()) { // 验证文件 } $path = $request->photo->path(); // 上传文件的路径 $extension = $request->photo->extension(); // 根据文件内容猜测匹配扩展名 // 存储上传文件 // `store`方法接受相对于文件系统配置的存储文件根目录的路径。 // 这个路径不能包含文件名,因为系统会自动生成唯一的 ID 作为文件名。 // `store`方法还接受可选的第二个参数,用于存储文件的磁盘名称。 $path = $request->photo->store('images'); $path = $request->photo->store('images', 's3'); // 自定义文件名称 $path = $request->photo->storeAs('images', 'filename.jpg'); $path = $request->photo->storeAs('images', 'filename.jpg', 's3'); ``` ## 配置可信代理 如果应用程序运行在失效的 TLS / SSL 证书的负载均衡器后,你可能会注意到应用程序有时不能生成 HTTPS 链接。通常这是因为你的应用程序正在从端口 80 上的负载均衡器转发流量,却不知道是否应该生成安全链接。 解决这个问题需要在 Laravel 应用程序中包含`App\Http\Middleware\TrustProxies`中间件,这使得你可以快速自定义应用程序信任的负载均衡器或代理。你的可信代理应该作为这个中间件的`$proxies`属性的数组列出。除了配置受信任的代理之外,还可以配置应该信任的代理`$header` ``` <?php namespace App\Http\Middleware; use Illuminate\Http\Request; use Fideloper\Proxy\TrustProxies as Middleware; class TrustProxies extends Middleware { /** * 应用程序的可信代理列表 * * @var array */ protected $proxies = [ '192.168.1.1', '192.168.1.2', ]; /** * 应该用来检测代理的头信息 * * @var string */ protected $headers = Request::HEADER_X_FORWARDED_ALL; } ``` **信任所有代理** ``` protected $proxies = '*'; ```