2017 © Pedro Peláez
 

library laravel-jsonapi

Laravel JSON-API Base.

image

czim/laravel-jsonapi

Laravel JSON-API Base.

  • Sunday, November 12, 2017
  • by czim
  • Repository
  • 2 Watchers
  • 13 Stars
  • 1,189 Installations
  • PHP
  • 0 Dependents
  • 0 Suggesters
  • 2 Forks
  • 2 Open issues
  • 40 Versions
  • 17 % Grown

The README.md

Latest Version on Packagist ![Software License][ico-license] Build Status Coverage Status, (*1)

JSON-API Base

Basic application elements for JSON-API projects., (*2)

Offers means for quickly scaffolding JSON-API compliance for Laravel applications., (*3)

This does NOT provide the means to set up the API or the means for user authorisation., (*4)

Disclaimer

This is very much a work in progress at this time. Interface- and other breaking changes may happen.
The old, discontinued version of this project is in the 0.9.5 branch., (*5)

Version Compatibility

Laravel Package
5.3 1.3
5.4 to 5.6 1.4
5.7 to 6.0 1.5

Note that version 1.5+ requires PHP 7.1.3+ and czim/laravel-dataobject 2.0+., (*6)

Changelog

View the changelog., (*7)

Installation

Via Composer, (*8)

``` bash $ composer require czim/laravel-jsonapi, (*9)


Add the `JsonApiServiceProvider` to your `config/app.php`: ``` php Czim\JsonApi\Providers\JsonApiServiceProvider::class,

Publish the configuration file., (*10)

``` bash php artisan vendor:publish, (*11)



### Exceptions In your `App\Exceptions\Handler`, change the `render()` method like so: ```php <?php public function render($request, Exception $exception) { if (is_jsonapi_request() || $request->wantsJson()) { return jsonapi_error($exception); } // ...

This will render exceptions thrown for all JSON-API (and JSON) requests as JSON-API error responses., (*12)

Middleware

To enforce correct headers, add the Czim\JsonApi\Http|Middleware\JsonApiHeaders middleware to the middleware group or relevant routes. You can do this by adding it to your App\Http\Kernel class:, (*13)

<?php
    protected $middlewareGroups = [
        'api' => [
            // ... 
            \Czim\JsonApi\Http\Middleware\RequireJsonApiHeader::class,
        ],
    ];

Note that this will block access to any consumers of your API that do not conform their HTTP header use to the JSON-API standard., (*14)

Documentation

Request Data

Request Query String Data

JSON-API suggests passing in filter and page data using GET parameters, such as:, (*15)

{API URL}?filter[id]=13&page[number]=2

This package offers tools for accessing this information in a standardized way:, (*16)

Using the jsonapi_query() global helper function. This returns the singleton instance of Czim\JsonApi\Support\Request\RequestParser., (*17)

<?php
    // Get the full filter data associative array.
    $filter = jsonapi_query()->getFilter();

    // Get a specific filter key value, if it is present (with a default fallback).
    $id = jsonapi_query()->getFilterValue('id', 0);

    // Get the page number.
    $page = jsonapi_query()->getPageNumber();

You can ofcourse also instantiate the request parser yourself to access these methods:, (*18)

<?php
    // Using the interface binding ...
    $jsonapi = app(\Czim\JsonApi\Contracts\Support\Request\RequestQueryParserInterface::class);

    // Or by instantiating it manually ...
    $jsonapi = new \Czim\JsonApi\Support\Request\RequestQueryParser(request());

    // After this, the same methods are available
    $id = $jsonapi->getFilterValue('id');

Request Body Data

For PUT and POST requests with JSON-API formatted body content, special FormRequests are provided to validate and access request body data: \Czim\JsonApi\Http\Requests\JsonApiRequest., (*19)

For POST requests where id may be omitted while creating a resource, use \Czim\JsonApi\Http\Requests\JsonApiRequest instead., (*20)

These classes may be extended and used as any other FormRequest class in Laravel., (*21)

There are also a global help functions jsonapi_request() and jsonapi_request_create(), that returns an instance of the relevant request class (and so mimics Laravel's request())., (*22)

Using this approach guarantees that requests are valid JSON-API by validating the input against a JSON Schema., (*23)

<?php
    // Get the root type of the object (which may be 'resource', 'error' or 'meta').
    $rootType = jsonapi_request()->data()->getRootType();

    // Get validated data for the current request.
    // This returns an instance of \Czim\JsonApi\Data\Root, which is a data object tree.
    $root = jsonapi_request()->data();

    // You can check what kind of resource data is contained.
    if ( ! $root->hasSingleResourceData()) {
        // In this case, the request would either have no "data" key,
        // or it would contain NULL or an array of multiple resources.
    } elseif ($root->hasMultipleResourceData()) {
        // In this case, the request has a "data" key that contains an array of resources.
    }

    // Embedded data may be accessed as follows (for single resource).
    $resourceId     = $root->data->id;
    $resourceType   = $root->data->type; 
    $attributeValue = $root->data->attributes->name;
    $relationType   = $root->data->relationships['some-relationship']->data->type;

The request data tree for a single-resource request:, (*24)

Request Data: Single Resource, (*25)

For more information on the data object tree, see the Data classes., (*26)

Encoding

This package offers an encoder to generate valid JSON-API output for variable input content., (*27)

With some minor setup, it is possible to generate JSON output according to JSON-API specs for Eloquent models and errors., (*28)

Eloquent models, single, collected or paginated, will be serialized as JSON-API resources., (*29)

More information on encoding and configuring resources., (*30)

Custom Encoding & Transformation

To use your own transformers for specific class FQNs for the content to be encoded, map them in the jsonapi.transform.map configuration key:, (*31)

<?php
    'map' => [
        \Your\ContentClassFqn\Here::class => \Your\TransformerClassFqn\Here::class,        
    ],

This mapping will return the first-matched for content using is_a() checks. More specific matches should be higher in the list., (*32)

As a last resort, you can always extend and/or rebind the Czim\JsonApi\Encoder\Factories\TransformerFactory to provide your own transformers based on given content type., (*33)

Contributing

Please see CONTRIBUTING for details., (*34)

Credits

License

The MIT License (MIT). Please see License File for more information., (*35)

The Versions

13/04 2017

dev-old-version

dev-old-version https://github.com/czim/laravel-jsonapi

Basic setup for making a JSON-API server in Laravel. Based on neomerx/json-api.

  Sources   Download

MIT

The Requires

 

The Development Requires

api framework json-api neomerx

20/12 2015

0.9.5

0.9.5.0 https://github.com/czim/laravel-jsonapi

Basic setup for making a JSON-API server in Laravel. Based on neomerx/json-api.

  Sources   Download

MIT

The Requires

 

The Development Requires

api framework json-api neomerx

20/12 2015

0.9.4

0.9.4.0 https://github.com/czim/laravel-jsonapi

Basic setup for making a JSON-API server in Laravel. Based on neomerx/json-api.

  Sources   Download

MIT

The Requires

 

The Development Requires

api framework json-api neomerx

19/12 2015

0.9.3

0.9.3.0 https://github.com/czim/laravel-jsonapi

Basic setup for making a JSON-API server in Laravel. Based on neomerx/json-api.

  Sources   Download

MIT

The Requires

 

The Development Requires

api framework json-api neomerx

18/12 2015

0.9.2

0.9.2.0 https://github.com/czim/laravel-jsonapi

Basic setup for making a JSON-API server in Laravel. Based on neomerx/json-api.

  Sources   Download

MIT

The Requires

 

The Development Requires

api framework json-api neomerx

15/12 2015

0.9.1

0.9.1.0 https://github.com/czim/laravel-jsonapi

Basic setup for making a JSON-API server in Laravel. Based on neomerx/json-api.

  Sources   Download

MIT

The Requires

 

The Development Requires

api framework json-api neomerx