Good content takes time and effort to come up with.

Please consider supporting us by just disabling your AD BLOCKER and reloading this page again.

Resourceful API Controller In PHP Laravel

Simple Way To Create Resourceful API Controller In Laravel

Share On     Share On WhatsApp     Share On LinkedIn

Hello There! I am back with another article on in my previous article I had shown you how to create Resourceful Controller for web in What Is Laravel Resourceful Controllers? article.

In this article I will show you how to

  1. Command To Create Simple Resourceful API Controllers
  2. Model Specific Resourceful API Controllers
  3. Automatic Routes Inside api.php
  4. Manual Routes Inside api.php
  5. Controllers Tricks For REST API


Laravel installed in your computer or server. To install Laravel you can use the following

composer create-project --prefer-dist laravel/laravel invoice

1) Command To Create Simple Resourceful API Controllers

Since I already had ProductsController for web.php demonstration I created ProductApiController for demonstrating the Resourceful API controller with routes inside api.php. And I am using Product as model name which resides inside App/Models/Product.php

php artisan make:controller ProductsApiController --api --resource

--resource - This parameter specifies that we are creating the resourceful controller.

--api - Specifies that we are creating API controller.

API resourceful controller creates the following functions inside ProductApiController


Observe that it has not created


As we are creating REST API Controller here we don't need any create() or edit() view pages.

2) Model Specific Resourceful API Controllers

Another beautiful thing what you can do with Laravel is specify the Model while creating the Resourceful API Controller because for Route Model Binding.

If you would like to learn more on route model binding then refer my article @ Route Model Binding In Laravel

php artisan make:controller ProductsApiController --api --resource --model Models/Product.php

--model - Since my Product.php model resides in App/Models/Product.php I have give the path as Models/Product.php. If you have model directly as App/Product.php then you can give --model Product.php

But as far as I know Route Model Binding with API's is bit tricky and sneaky one.

3) Automatic Routes Inside api.php

Instead of adding individual API routes in api.php file you can simply add the following code. This will create the routes automatically for us.

Route::apiResource('products', 'ProductsApiController');

You can also register multiple API routes at once with the following code

    'photos' => 'ProductsController',
    'posts'  => 'InvoiceController'

In the above line observer apiResource carefully. This will generate API routes only.

To check the list of available routes you can use the following command

php artisan route:list

You will be able to see similar to the following output. You will be able to see other fields along with the 3 columns I have actually filtered the columns with the following command

php artisan route:list --columns=Method,URI,Action

| Method    | URI                     | Action                                             |

| GET|HEAD  | api/products            | App\Http\Controllers\ProductsApiController@index   |

| POST      | api/products            | App\Http\Controllers\ProductsApiController@store   |

| GET|HEAD  | api/products/{product}  | App\Http\Controllers\ProductsApiController@show    |

| PUT|PATCH | api/products/{product}  | App\Http\Controllers\ProductsApiController@update  |

| DELETE    | api/products/{product}  | App\Http\Controllers\ProductsApiController@destroy |

4) Manual Routes Inside api.php

We saw how to add the automatic routes inside our api.php, just incase if you feel secured or want very few routes with few modifications then you can use the following way


Route::get('/products', 'ProductsApiController@index');
Route::post('/products', 'ProductsApiController@store');
Route::get('/products/{product}', 'ProductsApiController@show');
Route::patch('/products/{product}', 'ProductsApiController@update');
Route::delete('/products/{product}', 'ProductsApiController@destroy');

Even these routes can be access with api prefixed with it. as follows

5) Controllers Tips For REST API

Now lets have a look at our implementation part. Basically here I will show you some tips


Basically in REST validation you need to return the JSON response. You can use the following way to validate and return the JSON response.

use Illuminate\Support\Facades\Validator;

$validator = Validator::make($request->all(), [
    'name'          => 'required',
    'product_image' => 'required',
if ($validator->fails()) {
    return response()->json([
        'status' => 'error', 
        'errors' => $validator->errors()
    ], 400);

Observe the following from the above code. We are using Validator to check the validation. It takes 2 parameters 1st is the POST form details we get this in Request $request variable, 2nd parameter takes the rules to validate the form data.

Validator::make($request->all(), [
    'name'          => 'required',
    'product_image' => 'required',

Returning JSON Response

We need to return if any validation fails. This needs to be in JSON response. Laravel provides simple way to achieve the same.

return response()->json(data_need_to_send, status_code);

1st Parameter (Data)- Usually the array of data that you need to send

2nd Parameter (Status Code) - This is the status code that needs to be sent if any success or errors

I basically use the following format for success

return response()->json([
    'status'    => 'success',
    'message'   => 'List of products.',
    'data'       => [
        'products'  => $product
], 200);

For errors I use the following format

return response()->json([
    'status'    => 'error',
    'message'   => $e->getMessage(),
    'errors'    => $errors /* Validation errors */
], 400);


Hope the article was very helpful for you. Please check the related article which might be very helpful for you.

Author Image

Channaveer Hakari

I am a full-stack developer working at WifiDabba India Pvt Ltd. I started this blog so that I can share my knowledge and enhance my skills with constant learning.

Never stop learning. If you stop learning, you stop growing