iamjulianacosta / laravel-jsonapi
基于 Laravel 5 的 JSON API
Requires
- illuminate/database: 5.3.*
- illuminate/http: 5.3.*
- illuminate/pagination: 5.3.*
- illuminate/support: 5.3.*
Requires (Dev)
- justinrainbow/json-schema: ^1.5
- phpunit/phpunit: 4.*
- dev-master
- v3.0.0-alpha8
- v3.0.0-alpha7
- v3.0.0-alpha6
- v3.0.0-alpha5
- v3.0.0-alpha4
- v3.0.0-alpha3
- v3.0.0-alpha2
- v3.0.0-alpha1
- v3.0.0-alpha
- v2.4.2
- 2.4.1
- v2.4
- v2.3.1
- v2.3
- v2.2
- v2.1
- v2.0
- v1.x-dev
- v1.3
- v1.2.16
- v1.2.15
- v1.2.14
- v1.2.13
- v1.2.12
- v1.2.11
- v1.2.10
- v1.2.9
- v1.2.8
- v1.2.7
- v1.2.6
- v1.2.5
- v1.2.4
- v1.2.3
- v1.2.2
- v1.2.1
- v1.2
- v1.1.3
- v1.1.2
- v1.1.1
- v1.1
- v1.0
- dev-develop
This package is not auto-updated.
Last update: 2018-02-06 19:48:01 UTC
README
重要!
这是从 egeriis/laravel-jsonapi 仓库的分支,根据我的需求进行了修改。对我来说它工作得很好,但我不确定它是否适合您。它与 JSON API 1.0 规范兼容,但并非所有功能都已在此时实现。我将在稍后完成它,但无法提供支持或积极参与完成。
此分支与原始仓库的主要区别
- JSON API 1.0 兼容性
- 缓存(使用 redis 驱动程序进行了测试)
原始 README
使用 Laravel 5 创建一个符合 jsonapi.org 的 API,简单快捷。
此库力求与最新的 JSON API 更新保持一致——因为规范仍在不断发展。如果您发现缺少某些内容,请贡献力量!
安装
将
echo-it/laravel-jsonapi
添加到您的 composer.json 依赖列表中(版本 2.0.0 或更高,以支持 Laravel 5)运行
composer update
。
要求
- PHP 5.4+
- Laravel 5
使用 laravel-jsonapi
此库旨在以 RESTful API 方法中发现的暴露模型的概念为基础。
只需几个步骤即可暴露您的模型
创建一个路由以引导请求
在此示例中,我们使用一个通用的路由来处理所有模型和 HTTP 方法
Route::any('{model}/{id?}', 'ApiController@handleRequest');
创建一个控制器来处理请求
您的控制器负责处理输入、实例化处理器类并返回响应。
<?php namespace App\Http\Controllers; use EchoIt\JsonApi\Request as ApiRequest; use EchoIt\JsonApi\ErrorResponse as ApiErrorResponse; use EchoIt\JsonApi\Exception as ApiException; use Request; class ApiController extends Controller { /** * Create handler name from request name * * @param $requestedResource string The name of the model (in plural) * * @return string Class name of related resource */ public function getHandlerClassName($requestedResource) { $modelName = Pluralizer::singular($requestedResource); return 'App\\Handlers\\' . ucfirst($modelName) . 'Handler'; } public function handleRequest($requestedResource, $id = null) { /** * Create handler name from model name * @var string */ $handlerClass = $this->getHandlerClassName($requestedResource); if (class_exists($handlerClass)) { $url = Request::url(); $method = Request::method(); $include = ($i = Request::input('include')) ? explode(',', $i) : $i; $sort = ($i = Request::input('sort')) ? explode(',', $i) : $i; $filter = ($i = Request::except('sort', 'include', 'page')) ? $i : []; $content = Request::getContent(); $page = Request::input('page'); $pageSize = null; $pageNumber = null; if($page) { if(is_array($page) && !empty($page['size']) && !empty($page['number'])) { $pageSize = $page['size']; $pageNumber = $page['number']; } else { return new ApiErrorResponse(400, 400, 'Expected page[size] and page[number]'); } } $request = new ApiRequest(Request::url(), $method, $id, $content, $include, $sort, $filter, $pageNumber, $pageSize); $handler = new $handlerClass($request); // A handler can throw EchoIt\JsonApi\Exception which must be gracefully handled to give proper response try { $res = $handler->fulfillRequest(); } catch (ApiException $e) { return $e->response(); } return $res->toJsonResponse(); } // If a handler class does not exist for requested model, it is not considered to be exposed in the API return new ApiErrorResponse(404, 404, 'Entity not found'); } }
为您的模型创建一个处理器
处理器负责暴露单个模型。
在此示例中,我们创建了一个支持以下请求的处理器
请求会自动路由到相应的处理器函数。
<?php namespace App\Handlers; use Symfony\Component\HttpFoundation\Response; use App\Models\User; use EchoIt\JsonApi\Exception as ApiException; use EchoIt\JsonApi\Request as ApiRequest; use EchoIt\JsonApi\Handler as ApiHandler; use Request; /** * Handles API requests for Users. */ class UsersHandler extends ApiHandler { const ERROR_SCOPE = 1024; /* * List of relations that can be included in response. * (eg. 'friend' could be included with ?include=friend) */ protected static $exposedRelations = []; /** * Handles GET requests. * @param EchoIt\JsonApi\Request $request * @return EchoIt\JsonApi\Model|Illuminate\Support\Collection|EchoIt\JsonApi\Response|Illuminate\Pagination\LengthAwarePaginator */ public function handleGet(ApiRequest $request) { //you can use the default GET functionality, or override with your own return $this->handleGetDefault($request, new User); } /** * Handles PUT requests. * @param EchoIt\JsonApi\Request $request * @return EchoIt\JsonApi\Model|Illuminate\Support\Collection|EchoIt\JsonApi\Response */ public function handlePut(ApiRequest $request) { //you can use the default PUT functionality, or override with your own return $this->handlePutDefault($request, new User); } }
注意:从
EchoIt\JsonApi\Model
扩展您的模型而不是Eloquent
,以获取正确的链接资源的响应。
当前功能
根据 jsonapi.org
处理器类中的每个功能都有自己的函数(例如 handlePaginationRequest、handleSortRequest 等),因此您可以轻松地用您自己的行为覆盖它们(如果需要的话)。