Skip to content
This repository has been archived by the owner on Jan 17, 2022. It is now read-only.

Two simple tools for building REST APIs with Fractal: console generator and API skeleton

Notifications You must be signed in to change notification settings

arrilot/laravel-api-generator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

44 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Total Downloads Scrutinizer Quality Score MIT License

Laravel Api Generator (No longer supported)

Two simple tools for building REST APIs with fractal: console generator and API skeleton

Introduction

This package provides two features

  1. Console generator which creates Controller, Fractal Transformer and routes in a single command.

  2. Basic REST API skeleton that can be really helpful if you need something standard. It's 100% optional.

If you do not use Fractal for your transformation layer, this package is probably not the right choice for you.

Installation

  1. Run composer require arrilot/laravel-api-generator

  2. Register a service provider in the app.php configuration file

<?php

'providers' => [
    ...
    'Arrilot\Api\ServiceProvider',
],
?>
  1. Copy basic folder structure to app/Api cp -R vendor/arrilot/laravel-api-generator/templates/Api app/Api and check what you got there. If you need you can use different paths later.

Usage

Generator

The only console command that is added is artisan make:api <ModelName>.

Imagine you need to create a rest api to list/create/update etc users from users table. To achieve that you need to do lots of boilerplate operations - create controller, transformer, set up needed routes.

php artisan make:api User does all the work for you.

  1. You may have noticed that after installation you already have a routes file app/Api/routes.php which looks like that:
<?php

Route::group(['prefix' => 'api/v1', 'namespace' => 'App\Api\Controllers'], function () {
    //
});

Feel free to change it if you like.

The generator adds Route::resource('users', 'UserController'); to the end of this file.

<?php

Route::group(['prefix' => 'api/v1', 'namespace' => 'App\Api\Controllers'], function () {
    //
    Route::resource('users', 'UserController');
});

As you can see it's smart enough to detect some route groups and treat this situation properly.

  1. Then the generator creates a controller that extends base api controller.
<?php namespace App\Api\Controllers;

use App\User;
use App\Api\Transformers\UserTransformer;

class UserController extends Controller
{
    /**
     * Eloquent model.
     *
     * @return \Illuminate\Database\Eloquent\Model
     */
    protected function model()
    {
        return new User;
    }

    /**
     * Transformer for the current model.
     *
     * @return \League\Fractal\TransformerAbstract
     */
    protected function transformer()
    {
        return new UserTransformer;
    }
}

You can customize this stub as much as you want.

  1. Finally the generator creates a fractal Transformer
<?php namespace App\Api\Transformers;

use App\User;
use League\Fractal\TransformerAbstract;

class UserTransformer extends TransformerAbstract
{
    /**
     * Resource key.
     *
     * @var string
     */
    protected $resourceKey = null;
    
    /**
     * Turn this item object into a generic array.
     *
     * @param $item
     * @return array
     */
    public function transform(User $item)
    {
        return [
            'id'         => (int)$item->id,
            'created_at' => (string)$item->created_at,
            'updated_at' => (string)$item->updated_at,
        ];
    }
}

This stub is customizable too.

Skeleton

You may have noticed that controller which has just been generated includes two public methods - model() and transformer() That's because those methods are the only thing that you need in your controller to set up a basic REST API if you use the Skeleton.

The list of routes that are available out of the box:

  1. GET api/v1/users
  2. GET api/v1/users/{id}
  3. POST api/v1/users
  4. PUT api/v1/users/{id}
  5. DELETE api/v1/users/{id}

Request and respone format is json Fractal includes are supported via $_GET['include']. Validation rules for create and update can be set by overwriting rulesForCreate and rulesForUpdate in your controller.

This skeleton is not a silver bullet but in many cases it can be either exactly what you need or can be used as a decent starting point for your api.

You can check https://github.com/Arrilot/laravel-api-generator/blob/master/src/Skeleton/BaseController.php for more info.

If you don't like the Skeleton just stop inheriting it in the base controller - Api\Controllers\Controller and overwrite the controller stub in your config to remove model() and transformer() methods.

Configuration

All paths and generator's stubs are configurable.

https://github.com/Arrilot/laravel-api-generator/blob/master/src/config/config.php

About

Two simple tools for building REST APIs with Fractal: console generator and API skeleton

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages