nimaebrazi / laravel-api-presenter
提供具有简单缓存的客户端响应。
v1.0.1
2019-04-04 05:59 UTC
Requires
- php: ^7.2
Requires (Dev)
- orchestra/testbench: ^3.7
This package is not auto-updated.
Last update: 2024-09-27 08:58:36 UTC
README
描述
简单且强大的客户端响应,与 Laravel 缓存集成。
安装
composer require nimaebrazi/laravel-api-presenter
注册 ServiceProvider
如果使用 laravel 5.4.* 及更早版本,您需要在 config/app.php 中添加 service provider
'providers' => [ ... \LaravelApiPresenter\ApiPresenterServiceProvider::class, ... ]
用法
1. 无缓存响应
示例 1.1
<?php namespace App\Http\Controllers; use App\User; use Illuminate\Http\Request; use LaravelApiPresenter\Contract\ApiPresenterInterface; use LaravelApiPresenter\Presenter\Model\ApiPresenterModel; class UserController extends Controller { /** * @var ApiPresenterInterface */ protected $apiPresenter; public function __construct(ApiPresenterInterface $apiPresenter) { $this->apiPresenter = $apiPresenter; } public function find($id) { $user = User::find($id); $apiPresenterModel = new ApiPresenterModel(); $apiPresenterModel ->withSuccessStatus() ->setMessage('Success fetch!') ->setMainKey('user') ->setData($user->toArray()); return $this->apiPresenter->present($apiPresenterModel); } }
{ "success": true, "message": "Success fetch!", "description": "", "data": { "main_key": "user", "user": { "id": 1, "name": "Mr. Claude Greenfelder I", "email": "carlie84@example.com", "email_verified_at": "2019-03-19 00:07:52", "created_at": "2019-03-19 00:07:52", "updated_at": "2019-03-19 00:07:52" } } }
示例 1.2
<?php namespace App\Http\Controllers; use App\User; use Illuminate\Http\Request; use LaravelApiPresenter\Contract\ApiPresenterInterface; use LaravelApiPresenter\Presenter\Model\ApiPresenterModel; class UserController extends Controller { /** * @var ApiPresenterInterface */ protected $apiPresenter; public function __construct(ApiPresenterInterface $apiPresenter) { $this->apiPresenter = $apiPresenter; } public function find() { $ids = [1,2,3]; $user = User::find($ids); $apiPresenterModel = new ApiPresenterModel(); $apiPresenterModel ->withSuccessStatus() ->setMessage('Success fetch!') ->setMainKey('user') ->setData($user->toArray()); return $this->apiPresenter->present($apiPresenterModel); } }
{ "success": true, "message": "Success fetch!", "description": "", "data": { "main_key": "user", "user": [ { "id": 1, "name": "Mr. Claude Greenfelder I", "email": "carlie84@example.com", "email_verified_at": "2019-03-19 00:07:52", "created_at": "2019-03-19 00:07:52", "updated_at": "2019-03-19 00:07:52" }, { "id": 2, "name": "Josiane Rath IV", "email": "isobel66@example.org", "email_verified_at": "2019-03-19 00:07:52", "created_at": "2019-03-19 00:07:52", "updated_at": "2019-03-19 00:07:52" }, { "id": 3, "name": "Mr. Godfrey Witting I", "email": "karine35@example.org", "email_verified_at": "2019-03-19 00:07:52", "created_at": "2019-03-19 00:07:52", "updated_at": "2019-03-19 00:07:52" } ] } }
2. 带缓存的单个对象响应
示例 2.1
<?php namespace App\Http\Controllers; use App\User; use Illuminate\Http\Request; use LaravelApiPresenter\Contract\ApiPresenterInterface; use LaravelApiPresenter\Presenter\Model\ApiPresenterModel; class UserController extends Controller { /** * @var ApiPresenterInterface */ protected $apiPresenter; public function __construct(ApiPresenterInterface $apiPresenter) { $this->apiPresenter = $apiPresenter; } public function find($id) { $user = User::find($id); $apiPresenterModel = new ApiPresenterModel(); $apiPresenterModel->withSuccessStatus() ->setMessage('Success fetch!') ->setMainKey('user') ->cacheable() ->setCacheKey("user_{$id}") ->setData($user->toArray()); return $this->apiPresenter->present($apiPresenterModel); } }
{ "success": true, "message": "Success fetch!", "description": "", "data": { "main_key": "user", "user": { "id": 1, "name": "Mr. Claude Greenfelder I", "email": "carlie84@example.com", "email_verified_at": "2019-03-19 00:07:52", "created_at": "2019-03-19 00:07:52", "updated_at": "2019-03-19 00:07:52" } } }
注意
这取决于您的应用程序缓存驱动设置。
例如,如果您使用 redis,您可以使用以下方法找到输出键:
laravel_cache:user_1
3. 带缓存和 自动分页 的响应
示例 3.1
<?php namespace App\Http\Controllers; use App\User; use Illuminate\Http\Request; use LaravelApiPresenter\Contract\ApiPresenterInterface; use LaravelApiPresenter\Presenter\Model\ApiPresenterModel; class UserController extends Controller { /** * @var ApiPresenterInterface */ protected $apiPresenter; public function __construct(ApiPresenterInterface $apiPresenter) { $this->apiPresenter = $apiPresenter; } public function all(Request $request) { $limit = $request->has('limit') ? $request->input('limit') : 5; $users = User::paginate($limit); $apiPresenterModel = new ApiPresenterModel(); $apiPresenterModel ->withSuccessStatus() ->setMessage('Success fetch!') ->setMainKey('users') ->withMeta() ->cacheable() ->setCacheKey("users") ->setData($users->toArray()); return $this->apiPresenter->present($apiPresenterModel); } }
{ "success": true, "message": "Success fetch!", "description": "", "data": { "main_key": "users", "users": [ { "id": 1, "name": "Mr. Claude Greenfelder I", "email": "carlie84@example.com", "email_verified_at": "2019-03-19 00:07:52", "created_at": "2019-03-19 00:07:52", "updated_at": "2019-03-19 00:07:52" }, { "id": 2, "name": "Josiane Rath IV", "email": "isobel66@example.org", "email_verified_at": "2019-03-19 00:07:52", "created_at": "2019-03-19 00:07:52", "updated_at": "2019-03-19 00:07:52" }, { "id": 3, "name": "Mr. Godfrey Witting I", "email": "karine35@example.org", "email_verified_at": "2019-03-19 00:07:52", "created_at": "2019-03-19 00:07:52", "updated_at": "2019-03-19 00:07:52" } ] }, "links": { "first": "http://127.0.0.1:8000/users?page=1", "last": "http://127.0.0.1:8000/users?page=34", "next": "http://127.0.0.1:8000/users?page=2", "prev": null }, "meta": { "current_page": 1, "from": 1, "last_page": 34, "path": "http://127.0.0.1:8000/users", "per_page": "3", "to": 3, "total": 100 } }
注意
包从元数据生成键,并在 redis 中转换缓存键。
laravel_cache:users__limit_3__page_1
4. 带缓存和 自定义分页 的响应
- 请注意,当使用自定义元数据时,您应该也自定义缓存键。假设您设置了缓存键
users
并对数据进行分页,然后响应客户端第一页
。因此,包设置了您的缓存users
而不将元数据附加到缓存键。当客户端限制数据的数量和页面时,您的响应可能不正确。 - 设置自定义元数据时不要使用
withMeta()
方法。
示例 4.1
<?php namespace App\Http\Controllers; use App\User; use Illuminate\Http\Request; use LaravelApiPresenter\Contract\ApiPresenterInterface; use LaravelApiPresenter\Presenter\Model\ApiPresenterModel; use LaravelApiPresenter\Presenter\Model\MetaModel; class UserController extends Controller { /** * @var ApiPresenterInterface */ protected $apiPresenter; public function __construct(ApiPresenterInterface $apiPresenter) { $this->apiPresenter = $apiPresenter; } public function all(Request $request) { $limit = $request->has('limit') ? $request->input('limit') : 5; $users = User::paginate($limit); $metaModel = new MetaModel(); $metaModel->setCurrentPage(1) ->setLastPage(3) ->setTo(3) ->setTotal(50); $apiPresenterModel = new ApiPresenterModel(); $apiPresenterModel ->withSuccessStatus() ->setMessage('Success fetch!') ->setMainKey('users') ->withMeta() ->cacheable() ->setCacheKey("users__limit_1__page_1") ->setData($users->toArray()); return $this->apiPresenter->present($apiPresenterModel); } }
有关 MetaModel 的更多信息,请参阅类
LaravelApiPresenter\Presenter\Model\MetaModel
如何设置自定义响应?
您可以在 ApiPresenter 中访问响应对象。
假设您想更改响应头
... $this->apiPresenter->response() ->header('X-Header-One', 'Header Value One ') ->header('X-Header-Two', 'Header Value Two'); ...