iamjulianacosta/laravel-jsonapi

此包已被废弃且不再维护。作者建议使用 jsonapi-laravel 包。

基于 Laravel 5 的 JSON API

v3.0.0-alpha8 2016-11-30 00:01 UTC

README

重要!

这是从 egeriis/laravel-jsonapi 仓库的分支,根据我的需求进行了修改。对我来说它工作得很好,但我不确定它是否适合您。它与 JSON API 1.0 规范兼容,但并非所有功能都已在此时实现。我将在稍后完成它,但无法提供支持或积极参与完成。

此分支与原始仓库的主要区别

  1. JSON API 1.0 兼容性
  2. 缓存(使用 redis 驱动程序进行了测试)

SensioLabsInsight

原始 README

Build Status

使用 Laravel 5 创建一个符合 jsonapi.org 的 API,简单快捷。

此库力求与最新的 JSON API 更新保持一致——因为规范仍在不断发展。如果您发现缺少某些内容,请贡献力量!

安装

  1. echo-it/laravel-jsonapi 添加到您的 composer.json 依赖列表中(版本 2.0.0 或更高,以支持 Laravel 5)

  2. 运行 composer update

要求

  • PHP 5.4+
  • Laravel 5

使用 laravel-jsonapi

此库旨在以 RESTful API 方法中发现的暴露模型的概念为基础。

只需几个步骤即可暴露您的模型

  1. 创建一个路由以引导请求

    在此示例中,我们使用一个通用的路由来处理所有模型和 HTTP 方法

    Route::any('{model}/{id?}', 'ApiController@handleRequest');
  2. 创建一个控制器来处理请求

    您的控制器负责处理输入、实例化处理器类并返回响应。

         <?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');
                }
            }
  3. 为您的模型创建一个处理器

    处理器负责暴露单个模型。

    在此示例中,我们创建了一个支持以下请求的处理器

    • GET /users(即 handleGet 函数)
    • GET /users/id
    • PUT /users/id

    请求会自动路由到相应的处理器函数。

        <?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 等),因此您可以轻松地用您自己的行为覆盖它们(如果需要的话)。

愿望清单