Laravel 5.5 响应式接口用于响应
发布于 作者: Paul Redmond
在 Laravel 5.5 路由中将支持一种新的返回类型:Responsable
接口。此契约允许将对象转换为 HTTP 响应实例,当从控制器或路由闭包返回时。Responsable
对象需要实现一个 toResponse()
方法,该方法将对象表示为 HTTP 响应。
<?php use Illuminate\Contracts\Support\Responsable; class ExampleObject implements Responsable{ public function __construct($name = null) { $this->name = $name ?? 'Teapot'; } public function status() { switch(strtolower($this->name)) { case 'teapot': return 418; default: return 200; } } public function toResponse() { return response( "Hello {$this->name}", $this->status(), ['X-Person' => $this->name] ); }}
在路由中使用 ExampleObject
,您现在可以执行以下操作
Route::get('/hello', function () { return new ExampleObject(request('name'));});
在框架中,Router 类在准备响应时现在会检查此类型
if ($response instanceof Responsable) { $response = $response->toResponse();}
假设您在 App\Http\Responses
命名空间中具有各种响应类型来组织您的响应。一个示例可能如下所示,以支持 Posts
模型
<?php namespace App\Http\Responses; class PostIndexResponse extends Response{ public function __construct($posts) { $this->posts = $posts; } public function toResponse() { return response()->json($this->transformPosts()); } protected function transformPosts() { return $this->posts->map(function ($post) { return [ 'title' => $post->title, 'description' => $post->description, 'body' => $post->body, 'published_date' => $post->published_at->toIso8601String(), 'created' => $post->created_at->toIso8601String(), ]; }); }}
这是一个基本示例,说明了一个简单的用例。它返回一个 JSON 响应,但您可能希望响应层包含其他功能,如内容协商。上面的示例还假定一个 App\Http\Responses\Response
类,该类可以提供一些基本功能。响应层还可以包含转换代码,如 Fractal,而不是直接在控制器中使用它。
与 PostsIndexResponse
协作的控制器可能如下所示
<?php namespace App\Http\Controllers; use App\Http\Responses; class PostsController extends Controller{ public function index() { $posts = \App\Post::all(); return new Responses\PostIndexResponse($posts); }}
查看 提交 以实现此契约。虽然简单,但我认为看到人们如何在 Laravel 5.5 中使用 Responsable
将会很有趣。