Lumen by examle. Lesson 2.
Table of contents
- Example 1: Basic REST API (Users CRUD)
- Example 2: JWT Authentication in Lumen
- Example 3: Task Management API with Middleware
- Example 4: File Upload API
- Example 5: Email Notification API
- Example 1: Basic REST API (Users CRUD)
- Example 2: JWT Authentication in Lumen
- Example 3: Task Management API with Middleware
- Example 4: File Upload API
- Example 5: Email Notification API
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:
Defines a REST API (
/users
) with CRUD endpoints to create, read, update, and delete users. UsesUserController
for logic.The
UserController
class interacts with theUser
model, using Eloquent ORM for database operations likefind()
,create()
,update()
, anddelete()
.Requests are handled via JSON responses, ensuring data consistency between the backend and client applications.
The
User
model specifiesfillable
properties, preventing mass-assignment vulnerabilities while simplifying database interactions.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:
Implements JWT authentication, generating a token on login and validating requests using it.
The login method checks if email and password are correct before issuing a JWT token.
Tokens contain
sub
(subject) andexp
(expiry) fields for user identification and security.The
profile
method extracts the authenticated user from the token, ensuring secure API access.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:
This task management API allows authenticated users to create, list, and delete tasks.
Middleware ensures only authenticated users can access task endpoints.
Uses Eloquent ORM for managing tasks in the database.
Implements REST principles with
201 Created
,204 No Content
, and200 OK
responses.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:
Implements a simple file upload API, storing files in the
/uploads
directory.Uses Laravel's file storage system to manage uploaded files securely.
Returns the stored file path as a JSON response for frontend consumption.
Protects against malicious uploads by enforcing file validation rules.
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:
Sends email notifications using Laravel’s Mail facade.
Uses raw email content, but can be extended with HTML templates.
Ideal for password resets, notifications, and user communication.
Uses environment variables (
.env
) for SMTP configuration.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:
Defines a REST API (
/users
) with CRUD endpoints to create, read, update, and delete users. UsesUserController
for logic.The
UserController
class interacts with theUser
model, using Eloquent ORM for database operations likefind()
,create()
,update()
, anddelete()
.Requests are handled via JSON responses, ensuring data consistency between the backend and client applications.
The
User
model specifiesfillable
properties, preventing mass-assignment vulnerabilities while simplifying database interactions.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:
Implements JWT authentication, generating a token on login and validating requests using it.
The login method checks if email and password are correct before issuing a JWT token.
Tokens contain
sub
(subject) andexp
(expiry) fields for user identification and security.The
profile
method extracts the authenticated user from the token, ensuring secure API access.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:
This task management API allows authenticated users to create, list, and delete tasks.
Middleware ensures only authenticated users can access task endpoints.
Uses Eloquent ORM for managing tasks in the database.
Implements REST principles with
201 Created
,204 No Content
, and200 OK
responses.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:
Implements a simple file upload API, storing files in the
/uploads
directory.Uses Laravel's file storage system to manage uploaded files securely.
Returns the stored file path as a JSON response for frontend consumption.
Protects against malicious uploads by enforcing file validation rules.
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:
Sends email notifications using Laravel’s Mail facade.
Uses raw email content, but can be extended with HTML templates.
Ideal for password resets, notifications, and user communication.
Uses environment variables (
.env
) for SMTP configuration.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.