Create Laravel 10 CRUD REST API

Laravel 16, Oct 2023

Let's assume you have Laravel installed and configured, follow these steps to create a basic CRUD REST API:

Create a New Laravel Project

composer create-project laravel/laravel laravel-crud-api
cd laravel-crud-api

Create a Model and Migration

php artisan make:model Expens -m

This command will generate a Expens Model and a corresponding migration file. Edit the migration to define the table structure.

Add Columns in Migration file database/migrations/....create_expens_table.php

public function up(): void
{
    Schema::create('expens', function (Blueprint $table) {
        $table->id();
        $table->float('amount');
        $table->text("description")->nullable();
        $table->date('date')->nullable();
        $table->timestamps();
    });
}

Run migration

php artisan migrate

Define the Model app/Models/Expens.php

class Expens extends Model
{
    use HasFactory;
    protected $fillable = ["id", "amount", "description", "date"];
}

Create a Controller

php artisan make:controller Api/ExpensController -r

This will generate a controller for your API. this controller will handle CRUD operations for Expenses. Define Routes in routes/api.php

Route::get('/expens', [ExpensController::class, 'index'])->name('expens.list');
Route::get('/expens/{id}', [ExpensController::class, 'show'])->name('expens.show');
Route::post('/expens', [ExpensController::class, 'store'])->name('expens.store');
Route::put('/expens/{id}', [ExpensController::class, 'update'])->name('expens.update');
Route::delete('/expens/{id}', [ExpensController::class, 'destroy'])->name('expens.destroy');

ExpensController.php

<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Models\Expens;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Validator;

class ExpensController extends Controller
{
    /**
     * Display a listing of the resource.
     */
    public function index()
    {
        $expenses = Expens::all();
        $data = array(
            "success" => true,
            "data" => $expenses
        );
        return response()->json($data, 200);
    }

    /**
     * Store a newly created resource in storage.
     */
    public function store(Request $request)
    {
        $data = array();
        $validator = Validator::make($request->all(), [
            'amount' => 'required',
            'date' => 'required',
            'description' => 'required',
        ]);

        if ($validator->passes()) {
            $expens = new Expens();
            $expens->amount = $request->amount;
            $expens->description = $request->description;
            $expens->date = Carbon::parse($request->date);
            $expens->save();

            $data = array(
                "message" => "Item Created Successfully!",
                "success" => true,
                "data" => $expens
            );
        } else {
            return response()->json(array("success" => false, "type" => 'validation', 'errors' => $validator->messages()))
                ->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY, Response::$statusTexts[Response::HTTP_UNPROCESSABLE_ENTITY]);
        }
        return response()->json($data, 201);
    }

    /**
     * Display the specified resource.
     */
    public function show(string $id)
    {
        $expense = Expens::where('id', $id)->first();
        $data = array(
            "success" => true,
            "data" => $expense
        );
        return response()->json($data, 200);
    }

    /**
     * Update the specified resource in storage.
     */
    public function update(Request $request, string $id)
    {
        $data = array();
        $expens = Expens::where('id', $id)->first();
        $validator = Validator::make($request->all(), [
            'amount' => 'required',
            'date' => 'required',
            'description' => 'required',
        ]);

        if ($validator->passes()) {
            $expens->amount = $request->amount;
            $expens->description = $request->description;
            $expens->date = Carbon::parse($request->date);
            $expens->save();

            $data = array(
                "message" => "Item Updated Successfully!",
                "success" => true,
                "data" => $expens
            );
        } else {
            return response()->json(array("success" => false, "type" => 'validation', 'errors' => $validator->messages()))
                ->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY, Response::$statusTexts[Response::HTTP_UNPROCESSABLE_ENTITY]);
        }
        return response()->json($data, 200);
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(string $id)
    {
        Expens::where('id', $id)->delete();
        $data = array(
            "message" => "Item Deleted Successfully!",
            "success" => true
        );
        return response()->json($data, 200);
    }
}

Test Your API You can use tools like Postman or cURL to test your API endpoints. Make sure your Laravel application is running (php artisan serve).