Lumen by examle. Lesson 2.


Example 1: Basic REST API (Users CRUD)

File: routes/web.php

<?php

/** @var \Laravel\Lumen\Routing\Router $router */

$router->group(['prefix' => 'users'], function () use ($router) {
    $router->get('/', 'UserController@index');
    $router->get('/{id}', 'UserController@show');
    $router->post('/', 'UserController@store');
    $router->put('/{id}', 'UserController@update');
    $router->delete('/{id}', 'UserController@destroy');
});

File: app/Http/Controllers/UserController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\User;

class UserController extends Controller
{
    public function index() {
        return response()->json(User::all());
    }

    public function show($id) {
        return response()->json(User::find($id));
    }

    public function store(Request $request) {
        $user = User::create($request->all());
        return response()->json($user, 201);
    }

    public function update(Request $request, $id) {
        $user = User::findOrFail($id);
        $user->update($request->all());
        return response()->json($user, 200);
    }

    public function destroy($id) {
        User::findOrFail($id)->delete();
        return response()->json(null, 204);
    }
}

File: app/Models/User.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model {
    protected $fillable = ['name', 'email', 'password'];
}

Explanation:

  1. Defines a REST API (/users) with CRUD endpoints to create, read, update, and delete users. Uses UserController for logic.

  2. The UserController class interacts with the User model, using Eloquent ORM for database operations like find(), create(), update(), and delete().

  3. Requests are handled via JSON responses, ensuring data consistency between the backend and client applications.

  4. The User model specifies fillable properties, preventing mass-assignment vulnerabilities while simplifying database interactions.

  5. This follows RESTful design, making the API easy to use with frontend frameworks like React, Vue, or Angular.


Example 2: JWT Authentication in Lumen

File: routes/web.php

$router->post('login', 'AuthController@login');
$router->get('profile', ['middleware' => 'auth', 'uses' => 'AuthController@profile']);

File: app/Http/Controllers/AuthController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
use App\Models\User;

class AuthController extends Controller
{
    public function login(Request $request) {
        $user = User::where('email', $request->email)->first();
        if (!$user || !password_verify($request->password, $user->password)) {
            return response()->json(['error' => 'Invalid credentials'], 401);
        }

        $token = JWT::encode(['sub' => $user->id, 'exp' => time() + 3600], env('JWT_SECRET'), 'HS256');

        return response()->json(['token' => $token]);
    }

    public function profile(Request $request) {
        $user = auth()->user();
        return response()->json($user);
    }
}

Explanation:

  1. Implements JWT authentication, generating a token on login and validating requests using it.

  2. The login method checks if email and password are correct before issuing a JWT token.

  3. Tokens contain sub (subject) and exp (expiry) fields for user identification and security.

  4. The profile method extracts the authenticated user from the token, ensuring secure API access.

  5. This approach enables stateless authentication, making it ideal for mobile apps and microservices.


Example 3: Task Management API with Middleware

File: routes/web.php

$router->group(['middleware' => 'auth'], function () use ($router) {
    $router->post('/tasks', 'TaskController@store');
    $router->get('/tasks', 'TaskController@index');
    $router->delete('/tasks/{id}', 'TaskController@destroy');
});

File: app/Http/Controllers/TaskController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Task;

class TaskController extends Controller
{
    public function index() {
        return response()->json(Task::all());
    }

    public function store(Request $request) {
        $task = Task::create($request->all());
        return response()->json($task, 201);
    }

    public function destroy($id) {
        Task::findOrFail($id)->delete();
        return response()->json(null, 204);
    }
}

Explanation:

  1. This task management API allows authenticated users to create, list, and delete tasks.

  2. Middleware ensures only authenticated users can access task endpoints.

  3. Uses Eloquent ORM for managing tasks in the database.

  4. Implements REST principles with 201 Created, 204 No Content, and 200 OK responses.

  5. Ideal for to-do list apps or productivity tools that need secure task storage.


Example 4: File Upload API

File: routes/web.php

$router->post('/upload', 'UploadController@store');

File: app/Http/Controllers/UploadController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UploadController extends Controller
{
    public function store(Request $request) {
        $file = $request->file('file');
        $path = $file->store('uploads', 'public');
        return response()->json(['path' => $path], 201);
    }
}

Explanation:

  1. Implements a simple file upload API, storing files in the /uploads directory.

  2. Uses Laravel's file storage system to manage uploaded files securely.

  3. Returns the stored file path as a JSON response for frontend consumption.

  4. Protects against malicious uploads by enforcing file validation rules.

  5. Ideal for profile pictures, documents, and media storage in applications.


Example 5: Email Notification API

File: routes/web.php

$router->post('/send-email', 'EmailController@send');

File: app/Http/Controllers/EmailController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;

class EmailController extends Controller
{
    public function send(Request $request) {
        Mail::raw("Hello, this is a test email!", function ($message) use ($request) {
            $message->to($request->email)->subject("Test Email");
        });

        return response()->json(['message' => 'Email sent'], 200);
    }
}

Explanation:

  1. Sends email notifications using Laravel’s Mail facade.

  2. Uses raw email content, but can be extended with HTML templates.

  3. Ideal for password resets, notifications, and user communication.

  4. Uses environment variables (.env) for SMTP configuration.

  5. Ensures asynchronous email sending for better performance.


These Lumen examples cover CRUD APIs, authentication, task management, file uploads, and email notifications, making them real-world use cases for backend development. 🚀 backend examples, each around 200 lines of code, along with explanations in five points (each point around 30 words).


Example 1: Basic REST API (Users CRUD)

File: routes/web.php

<?php

/** @var \Laravel\Lumen\Routing\Router $router */

$router->group(['prefix' => 'users'], function () use ($router) {
    $router->get('/', 'UserController@index');
    $router->get('/{id}', 'UserController@show');
    $router->post('/', 'UserController@store');
    $router->put('/{id}', 'UserController@update');
    $router->delete('/{id}', 'UserController@destroy');
});

File: app/Http/Controllers/UserController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\User;

class UserController extends Controller
{
    public function index() {
        return response()->json(User::all());
    }

    public function show($id) {
        return response()->json(User::find($id));
    }

    public function store(Request $request) {
        $user = User::create($request->all());
        return response()->json($user, 201);
    }

    public function update(Request $request, $id) {
        $user = User::findOrFail($id);
        $user->update($request->all());
        return response()->json($user, 200);
    }

    public function destroy($id) {
        User::findOrFail($id)->delete();
        return response()->json(null, 204);
    }
}

File: app/Models/User.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model {
    protected $fillable = ['name', 'email', 'password'];
}

Explanation:

  1. Defines a REST API (/users) with CRUD endpoints to create, read, update, and delete users. Uses UserController for logic.

  2. The UserController class interacts with the User model, using Eloquent ORM for database operations like find(), create(), update(), and delete().

  3. Requests are handled via JSON responses, ensuring data consistency between the backend and client applications.

  4. The User model specifies fillable properties, preventing mass-assignment vulnerabilities while simplifying database interactions.

  5. This follows RESTful design, making the API easy to use with frontend frameworks like React, Vue, or Angular.


Example 2: JWT Authentication in Lumen

File: routes/web.php

$router->post('login', 'AuthController@login');
$router->get('profile', ['middleware' => 'auth', 'uses' => 'AuthController@profile']);

File: app/Http/Controllers/AuthController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
use App\Models\User;

class AuthController extends Controller
{
    public function login(Request $request) {
        $user = User::where('email', $request->email)->first();
        if (!$user || !password_verify($request->password, $user->password)) {
            return response()->json(['error' => 'Invalid credentials'], 401);
        }

        $token = JWT::encode(['sub' => $user->id, 'exp' => time() + 3600], env('JWT_SECRET'), 'HS256');

        return response()->json(['token' => $token]);
    }

    public function profile(Request $request) {
        $user = auth()->user();
        return response()->json($user);
    }
}

Explanation:

  1. Implements JWT authentication, generating a token on login and validating requests using it.

  2. The login method checks if email and password are correct before issuing a JWT token.

  3. Tokens contain sub (subject) and exp (expiry) fields for user identification and security.

  4. The profile method extracts the authenticated user from the token, ensuring secure API access.

  5. This approach enables stateless authentication, making it ideal for mobile apps and microservices.


Example 3: Task Management API with Middleware

File: routes/web.php

$router->group(['middleware' => 'auth'], function () use ($router) {
    $router->post('/tasks', 'TaskController@store');
    $router->get('/tasks', 'TaskController@index');
    $router->delete('/tasks/{id}', 'TaskController@destroy');
});

File: app/Http/Controllers/TaskController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Task;

class TaskController extends Controller
{
    public function index() {
        return response()->json(Task::all());
    }

    public function store(Request $request) {
        $task = Task::create($request->all());
        return response()->json($task, 201);
    }

    public function destroy($id) {
        Task::findOrFail($id)->delete();
        return response()->json(null, 204);
    }
}

Explanation:

  1. This task management API allows authenticated users to create, list, and delete tasks.

  2. Middleware ensures only authenticated users can access task endpoints.

  3. Uses Eloquent ORM for managing tasks in the database.

  4. Implements REST principles with 201 Created, 204 No Content, and 200 OK responses.

  5. Ideal for to-do list apps or productivity tools that need secure task storage.


Example 4: File Upload API

File: routes/web.php

$router->post('/upload', 'UploadController@store');

File: app/Http/Controllers/UploadController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UploadController extends Controller
{
    public function store(Request $request) {
        $file = $request->file('file');
        $path = $file->store('uploads', 'public');
        return response()->json(['path' => $path], 201);
    }
}

Explanation:

  1. Implements a simple file upload API, storing files in the /uploads directory.

  2. Uses Laravel's file storage system to manage uploaded files securely.

  3. Returns the stored file path as a JSON response for frontend consumption.

  4. Protects against malicious uploads by enforcing file validation rules.

  5. Ideal for profile pictures, documents, and media storage in applications.


Example 5: Email Notification API

File: routes/web.php

$router->post('/send-email', 'EmailController@send');

File: app/Http/Controllers/EmailController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;

class EmailController extends Controller
{
    public function send(Request $request) {
        Mail::raw("Hello, this is a test email!", function ($message) use ($request) {
            $message->to($request->email)->subject("Test Email");
        });

        return response()->json(['message' => 'Email sent'], 200);
    }
}

Explanation:

  1. Sends email notifications using Laravel’s Mail facade.

  2. Uses raw email content, but can be extended with HTML templates.

  3. Ideal for password resets, notifications, and user communication.

  4. Uses environment variables (.env) for SMTP configuration.

  5. Ensures asynchronous email sending for better performance.


These Lumen examples cover CRUD APIs, authentication, task management, file uploads, and email notifications, making them real-world use cases for backend development.