laravel5.2总结--响应
1 基本响应
1.1 返回一个字符串,指定的字符串会被框架自动转换成 HTTP 响应。
Route::get('/', function () { return 'Hello World'; });
1.2 返回一个完整的 Response 实例时,就能够自定义响应的 HTTP 状态码以及标头。
use Illuminate\Http\Response; 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); });
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', ]);
3.重定向
3.1 简单重定向
最简单的方式就是通过全局的 redirect 辅助函数:
Route::get('dashboard', function () { return redirect('home/dashboard'); });
有时你可能希望将用户重定向至前一个位置,例如当提交一个无效的表单之后。这时可以使用全局的 back 辅助函数来达成这个目的:
Route::post('user/profile', function () { // 验证该请求... return back()->withInput(); });
3.2 重定向至命名路由
当你调用 redirect 辅助函数且不带任何参数时,将会返回 Illuminate\Routing\Redirector 的实例,你可以对该 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