2017 © Pedro Peláez
 

library json-api-server

Set up a JSON API in Laravel in just a few minutes.

image

swisnl/json-api-server

Set up a JSON API in Laravel in just a few minutes.

  • Wednesday, May 9, 2018
  • by swisnl
  • Repository
  • 3 Watchers
  • 3 Stars
  • 124 Installations
  • PHP
  • 0 Dependents
  • 0 Suggesters
  • 1 Forks
  • 1 Open issues
  • 4 Versions
  • 9 % Grown

The README.md

Latest Version on Packagist Build Status License: MIT Made by SWIS, (*1)

🚨 THIS PACKAGE HAS BEEN ABANDONED 🚨, (*2)

We don't use this package anymore in our own projects and there are many, better alternatives, so that's why we have chosen to abandon it. We suggest using laravel-json-api/laravel or one of the other alternatives instead. Feel free to fork our code and maintain your own copy., (*3)

Laravel JSON API server

Set up a laravel API in just a few minutes with this package. All the standard API functionality is already there for you., (*4)

This package strives to save you some time while building your API. It already has the basic features an API should have, like:, (*5)

  • Generators to generate your needed files for each model
  • An abstract layer to handle your basic CRUD actions
  • Creates routes for all your endpoints
  • Support for a few useful URL parameters
  • Permission and route permission handling
  • Responses in json api format (http://jsonapi.org/)
  • Automatically translates your models based on your database

Install

Via Composer, (*6)

$ composer require swisnl/json-api-server

Sample

Please see the folder sample for a sample of an application using this package., (*7)

Usage

Base Api Classes

There are a few base classes your classes should/could inherit:, (*8)

BaseApiController

This controller handles your basic CRUD actions as well as permissions if you choose to use permissions., (*9)

BaseApiRepository

This repository is a standard base repository with a small addition that it figures out your models relationships., (*10)

If you want to use your own BaseRepository, you have to implement the RepositoryInterface. This ensures that you have full compatibility with the BaseApiController., (*11)

The BaseApiRepository uses a trait to retrieve a models relationships. You can use this trait if you want to use the existing implementation., (*12)

Generating the required files

After installing the package you can instantly generate all the required files by executing this command:, (*13)

$ php artisan json-api-server:generate-all {Model}

To override the default path without overriding the laravel_generator config file, you can use the --path={path} option. For example:, (*14)

$ php artisan json-api-server:generate-all Test --path=app/temp/

This generates the following files:, (*15)

  • An eloquent model
  • A translation model
  • An API controller
    • Should extend the BaseApiController
  • A routes file where the all the CRUD endpoints are defined
  • A repository for your model
    • Could extend the BaseApiRepository
  • A policy for checking permissions
  • 1 test for checking if a user has permissions for the endpoint

You'll be able to do the basic CRUD actions without writing anything., (*16)

You also have the ability to generate the files separately:, (*17)

$ php artisan json-api-server:generate-controller {name}
$ php artisan json-api-server:generate-model {name}
$ php artisan json-api-server:generate-model-permissions {name}
$ php artisan json-api-server:generate-policy {name}
$ php artisan json-api-server:generate-repository {name}
$ php artisan json-api-server:generate-routes {name}
$ php artisan json-api-server:generate-test {name}
$ php artisan json-api-server:generate-translation {name}

Configuration

If you would like to override the configuration files., (*18)

$ php artisan vendor:publish --tag=laravel-api
$ php artisan vendor:publish --tag=laravel-api-templates

If you decide to override the templates, make sure you override the laravel api config too. You have to define where your own templates are in the config., (*19)

This is the default configuration:, (*20)

   return [
     // Generator configuration
     'path' => [
         'model' => app_path('/'),

         'model_permissions' => app_path('Permissions/'),

         'translation' => app_path('Translations/'),

         'controller' => app_path('Http/Controllers/Api/'),

         'repository' => app_path('Repositories/'),

         'policy' => app_path('Policies/'),

         'auth_test' => base_path('tests/Authentication/'),

         'templates' => 'vendor/swisnl/laravel-api/resources/templates/',

         'routes' => app_path('Http/Routes/')
     ],

     'namespace' => [
         'model' => 'App',

         'model_permissions' => 'App\Permissions',

         'controller' => 'App\Http\Controllers\Api',

         'repository' => 'App\Repositories',

         'translation' => 'App\Translations',

         'policy' => 'App\Policies',

         'auth_test' => 'App\Tests\Authentication'
     ],

     // Permissions configuration
     'permissions' => [
         'checkDefaultIndexPermission' => false,

         'checkDefaultShowPermission' => false,

         'checkDefaultCreatePermission' => false,

         'checkDefaultUpdatePermission' => false,

         'checkDefaultDeletePermission' => false,
     ],

     // Load all relationships to have response exactly like json api. This slows down the API immensely.
     'loadAllJsonApiRelationships' => true,
]; 

Requests and responses

All requests and responses are formatted according to the format specified by http://jsonapi.org/., (*21)

There are several respond methods at your disposal in your controller. The following respond methods are implemented at this moment:, (*22)

return $this->respondWithOk($object);
return $this->respondWithPartialContent($object);
return $this->respondWithCreated($object);
return $this->respondWithNoContent($object);
return $this->respondWithCollection($object);

These methods automatically converts your objects to json api format and creates a response with the correct status code and body., (*23)

Using policies

If you decide to use policies to check for the user's pemissions you have to add the policies to your Providers\AuthServiceProvider., (*24)

 protected $policies = [
     Sample::class => SamplePolicy::class,
 ];

 public function boot()
 {
     $this->registerPolicies();
 }    

The policies are preconfigured to work with Laravel passport, if you want to use another form of authorizing actions you can change the methods., (*25)

If you want to redirect the validation to a specific function in your policy., (*26)

$this->authorizeAction('show');

If you want to check if they can request a specific object you can add that object as the second parameter:, (*27)

$this->authorizeAction('show', $requestedObject);

URL parameters out of the box

The following URL parameters are supported after installing this package:, (*28)

  • ?include={relationship}: To add all relationship data to the response.
  • ?page={pageNumber}: To decide which page the pagination should show.
  • ?per_page={amountToShowPerPage}:To decide how many items you get per page.
  • ?ids={commaSeperatedIds}: To retrieve a collection of objects belonging to the ids.
  • ?exclude_ids={commaSeperatedIds}: To retrieve a collection of objects not belonging to the ids.
  • ?lang={language}: (Requires the configure-locale middleware) to change the php locale to the desired language and automatically translates all translatable models.
  • ?fields={columns}: To retrieve certain columns.
  • ?order_by_desc={column}: To order descending based on a column.
  • ?order_by_asc={column}: To order ascending based on a column.

Mandatory middleware

  • inspect_content_type: Required. It ensures that the requests should be in json format. If it's in another format it throws a ContentTypeNotSupportedException.

Optional middleware

There is optional middleware:, (*29)

  • configure-locale: used to configure the language for translating your responses. Also configurable by using the URL paramater ?lang={language}

Passport installation

Note: if you want to know more about laravel passport and why these commands should be run go to https://laravel.com/docs/passport, (*30)

$ composer require laravel/passport
$ php artisan migrate
$ php artisan passport:install

After running this command, add the Laravel\Passport\HasApiTokens trait to your App\User model, (*31)

Next, you should call the Passport::routes method within the boot method of your AuthServiceProvider., (*32)

Finally, in your config/auth.php configuration file, you should set the driver option of the api authentication guard to passport. This will instruct your application to use Passport's TokenGuard when authenticating incoming API requests., (*33)

If you created your own routes make sure you have the auth:api middlware on all the routes you want to use passport with., (*34)

Packages Laravel-Api uses

Laravel framework
  • https://laravel.com/docs/
Astrotomic / laravel-translatable
  • https://github.com/Astrotomic/laravel-translatable

Change log

Please see CHANGELOG for more information on what has changed recently., (*35)

Contributing

Please see CONTRIBUTING and CODE_OF_CONDUCT for details., (*36)

Security

If you discover any security related issues, please email security@swis.nl instead of using the issue tracker., (*37)

Credits

License

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

SWIS

SWIS is a web agency from Leiden, the Netherlands. We love working with open source software., (*39)

The Versions