【发布时间】:2020-11-14 18:46:34
【问题描述】:
我正在尝试在刚刚创建的Laravel 中构建我的项目,以将其用作back-end API。我希望以官方网站上定义的JSON:API 格式返回来自Laravel 的所有回复:https://jsonapi.org/format/
例如: 我创建了以下 2 个资源文件:
1-php artisan make:resource User
2-php artisan make:resource UserCollection --collection
两个简单的资源文件,一个返回resource,一个返回collection。
现在,我想在我的所有回复中返回以下格式:
- 如果是
success
1-状态返回码可以是200、201或202。
2- 返回的响应应该类似于以下内容:
{
"data": [
{
"id": 1,
"email": "collins.elody@example.org"
}
],
"message": null,
"success": true
}
您可能想知道传递message 键有什么意义,在本例中是null,因为它将返回一个collection 记录,即读取 ,但如果您需要添加新记录、更新或删除一条记录,则需要将消息传递给我的front-end ,在这种情况下,我会使用该密钥。
示例,添加记录,响应状态码201:
{
"data": [],
"message": "Record created succesfully",
"success": true
}
- 如果是
failure
如这里所说:https://jsonapi.org/format/#document-top-level:成员数据和错误不能共存于同一个文档中。
所以,如果出现错误,我需要将data 密钥更改为errors 密钥,例如,假设我正在尝试验证自己,并且验证失败,在这种情况下,结果应该是这样的:
{
"errors": {
"email": "E-Mail is required",
"password": "Password is required"
},
"message": null,
"success": false
}
或者我只想返回一个error message,预期的输出应该是:
{
"errors": [],
"message": "Something is Wrong!",
"success": false
}
所以本质上,我需要的是一个全局包装器,用于我从 Laravel 中做出的所有响应。我想以一种优雅的方式调用 return 如下:
return $this->success($collection);
或
return $this->success('Done!', 201);
所以首先想到的是创建一个trait 并定义您需要的方法,然后从Laravel 中的任何位置调用它们
我的Trait
<?php
namespace App\Traits;
trait APIResponse
{
public function success($data, $status = 200) {
return [
'data' => $data,
'success' => in_array($status, [200, 201, 202]) ? true : false,
'message' => null
];
}
public function failure($data, $status = 500) {
// TODO
}
}
我的Controller
class ExampleController extends Controller
{
public function index() {
$collection = new UserCollection(User::all());
return $this->success($collection);
}
}
但我不确定这是正确的方法,请在该领域的技术人员可以帮助我。非常感谢您。
【问题讨论】:
标签: php laravel api lumen fractals