hpolthof / laravel-api by hpolthof

An API rendering package for Laravel 5
20
3
2
Package Data
Maintainer Username: hpolthof
Maintainer Contact: hpolthof@gmail.com (Paul Olthof)
Package Create Date: 2016-11-28
Package Last Update: 2017-01-11
Language: PHP
License: GPL2
Last Refreshed: 2024-04-25 15:10:40
Package Statistics
Total Downloads: 20
Monthly Downloads: 0
Daily Downloads: 0
Total Stars: 3
Total Watchers: 2
Total Forks: 0
Total Open Issues: 0

Uniform API rendering for Laravel 5

Latest Stable Version License Total Downloads

This package was created for an internal project, but as the idea is reusable, I encourage others to make use of this package.

The main goal was to create an uniform way of presenting API output, and the creation of a layer between data structure and output.

Installation

Require this package with composer:

composer require hpolthof/laravel-api

Add the follow service provider to your config/app.php:

'Hpolthof\LaravelAPI\APIServiceProvider',

Middleware

A new middleware named api.errors will be added to your list of available middleware.

If you're using Laravel 5.3, this middleware will also be added into the api middleware group.

Usage

To use this package you should implement the Hpolthof\LaravelAPI\Contracts\ShouldMorphAPI interface onto an Eloquent model.

You'll have to implement the function bindAPI() and have to return an instance of Hpolthof\LaravelAPI\Binding.

Like this:

public function bindAPI()
{
    return Binding::create([
        'street' => $this->street,
        'street_nr' => $this->number,
        'street_suffix' => $this->suffix,
        'postcode' => $this->zip,
        'city' => $this->city,
    ]);
}

In a controller you can then return the following:

public function index()
{
    $items = Address::all();
    return \Response::api($items);
}
    
public function show($id)
{
    $item = Address::find($id);
    return \Response::api($item);
}

The response would look something like this:

{
    "header": {
        "request": {
            "location": "http:\/\/localhost:8000\/api\/addresses",
            "method": "GET",
            "parameters": []
        },
        "response": {
            "status": 200,
            "error": null,
            "timestamp": "2016-11-28 14:09:35"
        }
    },
    "content": [
        {
            "street": "Van der Polweg",
            "street_nr": 17,
            "street_suffix": "",
            "postcode": "3384HD",
            "city": "Amersfoort",
        },
        {
            "street": "Van der Polweg",
            "street_nr": 15,
            "street_suffix": "",
            "postcode": "3384HD",
            "city": "Amersfoort",
        }
    ]
}

Error messages

Sometimes you'll need to force an error to the user, this can be done by throwing an exception. The package also provides some specific exceptions that should be used where relevant.

Hpolthof\LaravelAPI\Exceptions\AccessDeniedException
Hpolthof\LaravelAPI\Exceptions\BadRequestException
Hpolthof\LaravelAPI\Exceptions\NotFoundException
Hpolthof\LaravelAPI\Exceptions\NotImplementedException

This would result in something like:

{
    "header": {
        "request": {
            "location": "http:\/\/localhost:8000\/api\/addresses",
            "method": "GET",
            "parameters": []
        },
        "response": {
            "status": 403,
            "error": "Forbidden",
            "timestamp": "2016-11-28 15:05:29"
        }
    }
}