Laravel中一般通过控制器方法依赖注入来获取当前请求的Request实例。
我们通过定义一个隐式控制器来进行本章节的测试。首先我们在routes.php定义路由如下:
| 1 2 | Route::controller('request','RequestController'); <span style="color: #ff0000;">注:在laravel5.4中不再支持这种路由写法了。</span> | 
然后我们在app/Http/Controllers下创建一个控制器RequestController.php:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Http\Response; use App\Http\Requests; use App\Http\Controllers\Controller; class RequestController extends Controller {     public function getBasetest(Request $request)     {         $input = $request->input('test');         echo $input;     } } | 
要访问getBasetest方法,我们只需在浏览器中访问http://laravel.app:8000/request/basetest?test=laravelacademy,这样页面会输出:
| 1 | laravelacademy | 
要获取当前请求的URL,我们可以通过Request实例上的path方法,需要注意的是该方法返回相对请求路径,如果要获取绝对请求路径,可以通过Request实例上的另一个方法——url:
| 1 2 3 4 5 6 7 8 9 10 11 12 | public function getUrl(Request $request) {     //匹配request/*的URL才能继续访问     if(!$request->is('request/*')){         abort(404);     }     $uri = $request->path();     $url = $request->url();     echo $uri;     echo '<br>';     echo $url; } | 
我们在浏览器中访问http://laravel.app:8000/request/url,页面输入如下内容:
| 1 2 | request/url http://laravel.app:8000/request/url | 
我们还可以通过调用Request实例上的getMethod方法获取当前请求的方法:
| 1 2 3 4 5 6 7 8 | public function getMethod(Request $request){     //非get请求不能访问     if(!$request->isMethod('get')){         abort(404);     }     $method = $request->method();     echo $method; } | 
使用Request实例上的input方法即可获取请求输入数据。该方法可以接收两个参数,第一个参数是传递参数名称,第二个参数是如果参数名为空返回的默认值,此外该方法还支持获取数组参数对应值,我们定义测试方法如下:
| 1 2 3 4 5 6 7 | public function getInputData(Request $request){     //获取GET方式传递的name参数,默认为LaravelAcademy     $name = $request->input('name','LaravelAcademy');     echo $name;     echo '<br>';     echo $request->input('test.0.name'); } | 
在浏览器中输入http://laravel.app:8000/request/input-data?name=Laravel&test[][name]=Academy,则页面输出:
| 1 2 | Laravel Academy | 
如果我们想要在获取输入值之前判断输入参数名是否存在,可以使用has方法,比如我们想要判断输入参数是否包含hello,可使用如下方法:
| 1 2 | if($request->has('hello'))     echo $request->input('hello'); | 
想要获取所有输入参数值,可以使用Request实例上的all方法;想要获取部分输入值,可使用only方法;想要排除部分输入参数值,可使用except方法:
| 1 2 3 4 5 6 7 8 9 10 11 | public function getInputData(Request $request){     $allData = $request->all();     $onlyData = $request->only('name','hello');     $exceptData = $request->except('hello');     echo '<pre>';     print_r($allData);     print_r($onlyData);     print_r($exceptData); } | 
在浏览器中访问http://laravel.app:8000/request/input-data?name=Laravel&test[][name]=Academy&hello=World,页面输出如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | Array (     [name] => Laravel     [test] => Array     (         [0] => Array         (             [name] => Academy         )     )     [hello] => World ) Array (     [name] => Laravel     [hello] => World ) Array (     [name] => Laravel     [test] => Array     (         [0] => Array         (             [name] => Academy         )     ) ) | 
上面的方法都是用于获取当前请求的输入,如果想要获取上一次请求的输入,需要在处理上一次请求时使用Request实例上的flash方法将请求数据暂时保存到session中,然后在当前请求中使用Request实例上的old方法获取session中保存的数据,获取到数据后就会将session中保存的请求数据销毁:
| 1 2 3 4 5 6 7 8 9 | public function getLastRequest(Request $request){     $request->flash(); } public function getCurrentRequest(Request $request){     $lastRequestData = $request->old();     echo '<pre>';     print_r($lastRequestData); } | 
如果我们想要在上次请求保存数据后重定向到当前请求URL,则可以使用如下方式定义getLastRequest方法:
| 1 2 3 4 | public function getLastRequest(Request $request){     //$request->flash();     return redirect('/request/current-request')->withInput(); } | 
这样我们在浏览器中访问http://laravel.app:8000/request/last-request?name=test&passwd=123456, 页面会重定向到http://laravel.app:8000/request/current-request并输出如下内容:
| 1 2 3 4 5 | Array (     [name] => test     [passwd] => 123456 ) | 
再次刷新页面,输出为空:
| 1 2 3 | Array ( ) | 
则表明取出数据后session中的请求数据被清空。更多方法使用参考HTTP请求官方文档。
我们可以使用Request实例上的cookie方法获取cookie数据,该方法可以接收一个参数名返回对应的cookie值,如果不传入参数,默认返回所有cookie值:
| 1 2 3 4 | public function getCookie(Request $request){     $cookies = $request->cookie();     dd($cookies); } | 
我们在浏览器中访问http://laravel.app:8000/request/cookie,页面输出:
| 1 2 3 4 | array:2 [     "XSRF-TOKEN" => "<span title="40 characters">fSP1erkCxnxX0wCyrJWJuR3ruH8c09VZXnR64nbC"     "laravel_session" => "<span title="40 characters">820e88a52c45f8dbda55e8c6aaaa9bbca2c760ef" ]</span></span> | 
我们可以调用Response实例上的withCookie方法新增cookie:
| 1 2 3 4 5 6 7 8 | public function getAddCookie(){     $response = new Response();     //第一个参数是cookie名,第二个参数是cookie值,第三个参数是有效期(分钟)     $response->withCookie(cookie('website','LaravelAcademy.org',1));     //如果想要cookie长期有效使用如下方法     //$response->withCookie(cookie()->forever('name', 'value'));     return $response; } | 
我们重新定义getCookie方法如下:
| 1 2 3 4 5 | public function getCookie(Request $request){     $cookie = $request->cookie('website');     echo $cookie; } | 
接下来我们在浏览器中访问http://laravel.app:8000/request/add-cookie,再访问http://laravel.app:8000/request/cookie,页面输出如下:
| 1 | LaravelAcademy.org | 
我们定义文件上传页面及上传处理如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | //文件上传表单 public function getFileupload() {     $postUrl = '/request/fileupload';     $csrf_field = csrf_field();     $html = <<<CREATE <form action="$postUrl" method="POST" enctype="multipart/form-data"> $csrf_field <input type="file" name="file"><br/><br/> <input type="submit" value="提交"/> </form> CREATE;     return $html; } //文件上传处理 public function postFileupload(Request $request){     //判断请求中是否包含name=file的上传文件     if(!$request->hasFile('file')){         exit('上传文件为空!');     }     $file = $request->file('file');     //判断文件上传过程中是否出错     if(!$file->isValid()){         exit('文件上传出错!');     }     $destPath = realpath(public_path('images'));     if(!file_exists($destPath))         mkdir($destPath,0755,true);     $filename = $file->getClientOriginalName();     if(!$file->move($destPath,$filename)){         exit('保存文件失败!');     }     exit('文件上传成功!'); } | 
通过以上代码可以看到我们可以使用Request实例上的file方法获取上传文件实例,该方法接收的参数是上传文件input标签的name属性,该文件上传实例是 Symfony\Component\HttpFoundation\File\UploadedFile类的实例,更多有关该实例的可用方法,可参考UploadedFile的API文档。