nimaebrazi/laravel-api-presenter

提供具有简单缓存的客户端响应。

v1.0.1 2019-04-04 05:59 UTC

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');
...