tequilarapido/api-response

在 Laravel 应用中以简单的方式返回格式良好的 JSON 响应。


README

在 Laravel 应用中以简单的方式返回格式良好的 JSON 响应。

Latest Version on Packagist Software License Build Status StyleCI Quality Score Code Coverage

Laravel Translation Sheet

安装

您可以使用 composer 安装此包

$ composer require tequilarapido/api-response

添加服务提供者

Tequilarapido\ApiResponse\ApiResponseServiceProvider::class 

使用方法

此包包含一个辅助函数 api_response(),作为使用 app(Tequilarapido\ApiResponse\ApiResponse::class) 的糖语法。

从项目(数组/关联数组/对象)返回响应

return api_response()->item(['result`' => 'success'])

结果

    {
        "data":
        {   
            "result":
            "success"
        }
    }

从集合返回响应

return api_response()->item(collect(['Apple', 'Orange', 'Kiwi']))

结果

    {
        "data":
            {   
                "Apple",
                "Orange",
                "Kiwi",
            }
    }

从分页集合返回响应

return api_response()->item(collect(['Apple', 'Orange', 'Kiwi']))

结果

    {
        "data": [1, 2, 3],
        "meta": {
            "pagination": {
                "count": 3,
                "current_page": 1,
                "links": {
                    "next": "/?page=2"
                },
                "per_page": 3,
                "total": 15,
                "total_pages": 5
            }
         }
    }

转换器

您可以使用转换器与 item()collection()paginatedCollection 方法一起使用,在返回响应之前转换结果。

有关转换器背后的概念的更多信息,请阅读 League\Fractal 文档

简单来说,转换器类必须扩展 League\Fractal\TransformerAbstract 并包含一个 transform() 方法,该方法接受原始值/对象作为参数,并按我们的意愿转换它。

假设我们需要返回一个包含从数据库中检索到的书籍集合的 API 响应,并且我们想要格式化/增强/限制结果。

class BookTransformer extends TransformerAbstract
{
    public function transform($book)
    {
        return [
            'id' => (int)$book->id,
            'title' => strtoupper($book->title),
            'price' => '$' . $book->price,
            'published_at' => $book->published_at->format('d/m/Y'),
            'url' => 'https://store.books.com/books/' . $book->id
        ];
    }
}
Route::get('/books', function () {

    // ie. Book::all()
   $books = collect([
       (object)['title' => 'An awesome book', 'id' => '1', 'price' => 10, 'published_at' => Carbon::createFromFormat('Y-m-d', '2016-10-01')],
       (object)['title' => 'A second awesome book', 'id' => '2', 'price' => 100, 'published_at' => Carbon::createFromFormat('Y-m-d', '2016-10-02')],
   ]);

   return api_response()->collection($books, new BookTransformer);
});

结果

{
    "data": [
        {
            "id": 1,
            "price": "$10",
            "published_at": "01/10/2016",
            "title": "AN AWESOME BOOK",
            "url": "https://store.books.com/books/1"
        },
        {
            "id": 2,
            "price": "$100",
            "published_at": "02/10/2016",
            "title": "A SECOND AWESOME BOOK",
            "url": "https://store.books.com/books/2"
        }
    ]
}

附加 cookies

对于 item()collection()paginatedCollection 方法,返回的结果是一个构建的 Illuminate\Http\Response 对象。

要附加 cookies,您需要指示 api_response() 方法不构建响应,将 $built 参数设置为 false,附加 cookie,然后构建响应。

return api_response()
    ->item(['result`' => 'success'], null, null, false)
    ->withCookie(new \Symfony\Component\HttpFoundation\Cookie('name', 'value'))
    ->build();

附加标题

对于 item()collection()paginatedCollection 方法,返回的结果是一个构建的 Illuminate\Http\Response 对象。

要附加标题,您需要指示 api_response() 方法不构建响应,将 $built 参数设置为 false,附加标题,然后构建响应。

return api_response()
    ->item(['result`' => 'success'], null, null, false)
    ->withHeader('X-CUSTOM', 'customvalue')
    ->build();

其他有用方法

更新日志

有关最近更改的更多信息,请参阅 更新日志

测试

$ composer test

安全

如果您发现任何与安全相关的问题,请通过 :author_email 发送电子邮件,而不是使用问题跟踪器。

贡献

有关详细信息,请参阅 贡献

鸣谢

许可证

MIT 许可证(MIT)。有关更多信息,请参阅 许可证文件