laravel5.2总结--响应

2019-09-30 作者:网络时代   |   浏览(138)

Route::get('testResponseView',function(){
    $value = 'text/html;charset=utf-8';
    return view('hello',['message'=>'Hello LaravelAcademy']));
});
效果和上面一样。

2 其它响应类型

2.1 视图响应

如果你想要控制响应状态码及标头,同时也想要返回一个视图作为返回的内容时,则可以使用 view 方法:

return response()->view('hello', $data)->header('Content-Type', $type);

当然,如果你没有自定义 HTTP 状态码及标头的需求,则可以简单的使用全局的 view 辅助函数。

return view('hello',$data);

2.2 JSON 响应

json 方法会自动将标头的 Content-Type 设置为 application/json,并通过 PHP 的 json_encode 函数将指定的数组转换为 JSON:

return response()->json(['name' => 'Abigail', 'state' => 'CA']);

如果你想创建一个 JSONP 响应,则可以使用 json 方法并加上 setCallback:

return response()->json(['name' => 'Abigail', 'state' => 'CA']) ->setCallback($request->input('callback'));

2.3 文件下载

download 方法可以用于生成强制让用户的浏览器下载指定路径文件的响应。download 方法接受文件名称作为方法的第二个参数,此名称为用户下载文件时看见的文件名称。最后,你可以传递一个 HTTP 标头的数组作为第三个参数传入该方法:

return response()->download($pathToFile); return response()->download($pathToFile, $name, $headers);

2.4 在响应发送给用户之前,使用 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', ]);

 

Route::get('testResponseCookie',function(){
    $content = 'Hello LaravelAcademy!';
    $status = 200;
    $value = 'text/html;charset=utf-8';
    return response($content,$status)->header('Content-Type',$value)
        ->withCookie('site','LaravelAcademy.org');
});
在浏览器中访问,F12查看Cookie信息:

3.重定向

3.1 简单重定向

最简单的方式就是通过全局的 redirect 辅助函数:

Route::get('dashboard', function () { return redirect('home/dashboard'); });

有时你可能希望将用户重定向至前一个位置,例如当提交一个无效的表单之后。这时可以使用全局的 back 辅助函数来达成这个目的:

Route::post('user/profile', function () { // 验证该请求... return back()->withInput(); });

3.2 重定向至命名路由

当你调用 redirect 辅助函数且不带任何参数时,将会返回 IlluminateRoutingRedirector 的实例,你可以对该 Redirector 的实例调用任何方法。举个例子,要生成一个 RedirectResponse 到一个命名路由,你可以使用 route 方法:

return redirect()->route('login');

如果你的路由有参数,则可以将参数放进 route 方法的第二个参数:

// 重定向到以下 URI: profile/{id} return redirect()->route('profile', [1]);

如果你要重定向至路由且路由的参数为 Eloquent 模型的「ID」,则可以直接将模型传入,ID 将会自动被提取:

return redirect()->route('profile', [$user]);

3.3 重定向至控制器行为

请记得,你不需要指定完整的命名空间,因为 Laravel 的 RouteServiceProvider 会自动设置默认的控制器命名空间:

return redirect()->action('HomeController@index');

当然,如果你的控制器路由需要参数的话,你可以传递它们至 action 方法的第二个参数:

return redirect()->action('UserController@profile', [1]);

3.4 重定向并加上 Session 闪存数据

通常重定向至新的 URL 时会一并写入闪存数据至session。所以为了方便,你可以利用链式调用的方式创建一个 RedirectResponse 的实例并闪存数据至 Session。这对于在一个动作之后保存状态消息相当方便:

Route::post('user/profile', function () { // 更新用户的个人数据... return redirect('dashboard')->with('status', 'Profile updated!'); });

当然,在用户重定向至新的页面后,你可以获取并显示session的闪存数据,注意这里闪存的信息和使用使用$request->flash()闪存数据提出方法不同,old('status')是取不到的,要使用session('status')

@if (session('status')) <div class="alert alert-success"> {{ session('status') }} </div> @endif

 

 

 

正如上面提到的,我们使用withCookie方法为响应添加cookie,由于header和withCookie支持方法链,所以我们可以这样使用:

1 基本响应

1.1 返回一个字符串,指定的字符串会被框架自动转换成 HTTP 响应。

Route::get('/', function () { return 'Hello World'; });

 

1.2 返回一个完整的 Response 实例时,就能够自定义响应的 HTTP 状态码以及标头。

use IlluminateHttpResponse; Route::get('home', function () { return (new Response($content, $status)) ->header('Content-Type', $value); });

为了方便起见,你可以使用辅助函数 response:

Route::get('home', function () { return response($content, $status) ->header('Content-Type', $value); });

使用action方法重定向到控制器动作:

 

Route::get('testResponseView',function(){
    $value = 'text/html;charset=utf-8';
    return response()->view('hello',['message'=>'Hello LaravelAcademy'])
        ->header('Content-Type',$value);
});
与之对应的,我们需要在resources/views下新建一个视图文件hello.blade.php,其内容如下:

如果返回的是JSONP响应,也很简单,只需要在json后面再调用setCallback即可:

Route::get('/hello/laravelacademy',['as'=>'academy',function(){
    return 'Hello LaravelAcademy';
}]);

Route::get('dashboard', function () {
    return redirect('home/dashboard');
});
如果要重定向到上一个位置,则使用back方法:

3.1 基本重定向

1.2 添加Cookie

2.1 视图响应

使用route方法重定向到命名路由:

生成json响应

Route::get('testResponseRedirect',function(){
    return redirect()->action('PostController@index');
});
在浏览器中访问http://laravel.app:8000/testResponseRedirect,则页面会跳转到http://laravel.app:8000/post并输出对应内容。

基本响应

3、 RedirectResponse篇
重定向响应是 IlluminateHttpRedirectResponse类的实例,我们通常使用全局帮助函数redirect来生成 RedirectResponse实例。和response类似,redirect函数如果接收参数则调用的是IlluminateRoutingRedirector类的to方法,如果无参调用则返回的是Redirector对象实例。

2.2 返回JSON/JSONP

Route::get('testResponseDownload',function(){
    return response()->download(
        realpath(base_path('public/images')).'/laravel-5-1.jpg',
        'Laravel学院.jpg'
    );
});
在浏览器中访问http://laravel.app:8000/testResponseDownload,页面将会下载laravel-5-1.jpg文件并保存为Laravel学院.jpg。

{{$message}}
接下来我们在浏览器中访问http://laravel.app:8000/testResponseView,页面输出:

此外,需要注意的是,IlluminateHttpResponse 类中还使用了ResponseTrait,header方法正是该trait提供的,除了header之外,该trait还提供了withCookie、content和status方法。header方法用于设置响应头信息,withCookie方法用于添加cookie,这两个方法都会返回调用它的Response自身对象,所以这两个方法都支持方法链(即多次调用header或withCookie方法);而content和status方法则用于返回当前响应的响应实体内容和响应状态码。

Route::post('user/profile', function () {
    // 更新用户属性...
    return redirect('dashboard')->with('status', 'Profile updated!');
});
这种特性通常在提交表单验证失败返回错误信息时很有用。

未加密cookie

Route::get('testResponseRedirect',function(){
    return redirect()->route('academy',100);
});
在浏览器中访问http://laravel.app:8000/testResponseRedirect,页面会跳转到http://laravel.app:8000/hello/laravelacademy/100并输出:

生成cookie

使用download方法可生成用于下载给定路径文件的响应,这里我们下载上一节上传的文件:

use IlluminateCookieMiddlewareEncryptCookies as BaseEncrypter;

Route::post('user/profile', function () {
    // 验证请求...
    return back()->withInput();
});
3.2 重定向到命名路由

使用view方法即可返回一个视图作为响应内容:

为方便使用,我们还可以使用全局帮助函数response来替代生成Response对象实例:

生成Cookie

本文由澳门新葡亰网址大全发布于网络时代,转载请注明出处:laravel5.2总结--响应

关键词: