Laravel 5.5 响应式接口用于响应

发布于 作者:

Laravel 5.5 Responsable Interface for Responses image

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 将会很有趣。

Paul Redmond photo

Laravel 新闻的撰稿人。全栈 web 开发人员和作者。

归档于
Cube

Laravel 新闻通讯

加入 40k+ 其他开发者,绝不错过新的技巧、教程等。

Laravel Forge logo

Laravel Forge

轻松创建和管理您的服务器,并在几秒钟内部署您的 Laravel 应用程序。

Laravel Forge
Tinkerwell logo

Tinkerwell

Laravel 开发人员必备的代码运行器。使用 AI、自动完成功能和本地和生产环境的即时反馈进行微调。

Tinkerwell
No Compromises logo

绝不妥协

Joel 和 Aaron,来自 No Compromises 播客的两名经验丰富的开发者,现在可以为您的 Laravel 项目聘用。 ⬧ 固定费率为 7500 美元/月。 ⬧ 没有冗长的销售流程。 ⬧ 无需合同。 ⬧ 100% 返款保证。

绝不妥协
Kirschbaum logo

Kirschbaum

提供创新和稳定性,以确保您的 web 应用程序取得成功。

Kirschbaum
Shift logo

Shift

运行旧版 Laravel?即时、自动化的 Laravel 升级和代码现代化,以保持您的应用程序更新。

Shift
Bacancy logo

Bacancy

让您拥有经验丰富的 Laravel 开发人员,拥有 4-6 年的经验,每月只需 2500 美元。获得 160 小时的专门知识和 15 天的无风险试用。立即安排通话!

Bacancy
Lucky Media logo

Lucky Media

立即获得幸运 - Laravel 开发的理想选择,拥有超过十年的经验!

Lucky Media
Lunar: Laravel E-Commerce logo

Lunar:Laravel 电子商务

Laravel 的电子商务。一个开源包,它将现代无头电子商务功能的强大功能带入 Laravel。

Lunar:Laravel 电子商务
LaraJobs logo

LaraJobs

官方 Laravel 工作板

LaraJobs
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit:Laravel SaaS 启动工具包

SaaSykit 是一个 Laravel SaaS 启动工具包,包含运行现代 SaaS 所需的所有功能。付款、漂亮的结帐、管理面板、用户仪表板、身份验证、现成组件、统计数据、博客、文档等等。

SaaSykit:Laravel SaaS 启动工具包
Rector logo

Rector

您无缝升级 Laravel、降低成本和加速创新的合作伙伴,以帮助成功企业。

Rector
MongoDB logo

MongoDB

使用 MongoDB 和 Laravel 的强大集成增强您的 PHP 应用程序,使开发人员能够轻松高效地构建应用程序。支持事务、搜索、分析和移动用例,同时使用熟悉的 Eloquent API。了解灵活、现代的 MongoDB 数据库如何改变您的 Laravel 应用程序。

MongoDB
Maska is a Simple Zero-dependency Input Mask Library image

Maska 是一个简单的零依赖输入掩码库

阅读文章
Add Swagger UI to Your Laravel Application image

在您的 Laravel 应用程序中添加 Swagger UI

阅读文章
Assert the Exact JSON Structure of a Response in Laravel 11.19 image

在 Laravel 11.19 中断言响应的精确 JSON 结构

阅读文章
Build SSH Apps with PHP and Laravel Prompts image

使用 PHP 和 Laravel 提示构建 SSH 应用程序

阅读文章
Building fast, fuzzy site search with Laravel and Typesense image

使用 Laravel 和 Typesense 构建快速、模糊的网站搜索

阅读文章
Add Comments to your Laravel Application with the Commenter Package image

使用 Commenter 包在您的 Laravel 应用程序中添加评论

阅读文章