Laravel by Example - Lesson 5: Advanced Backend Techniques
Laravel by Example - Lesson 5: Advanced Backend Techniques
Example 1: Custom Middleware for Logging Requests
Code:
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Middleware\LogRequestsMiddleware;
use App\Http\Controllers\TestController;
Route::middleware([LogRequestsMiddleware::class])->group(function () {
Route::get('/test', [TestController::class, 'index']);
});
?>
//----------------------------------------------------------------//
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
class LogRequestsMiddleware
{
public function handle(Request $request, Closure $next)
{
Log::info('Incoming request', ['url' => $request->url(), 'method' => $request->method()]);
return $next($request);
}
}
?>
//----------------------------------------------------------------//
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class TestController extends Controller
{
public function index()
{
return response()->json(['message' => 'Request logged successfully']);
}
}
?>
Explanation:
Creates a custom middleware: Logs all incoming API requests for tracking.
Middleware runs before processing requests: The
handle()
function executes before the request reaches controllers.Logs request URL and method: Helps monitor API usage and debugging.
Enhances security monitoring: Useful for detecting unusual API requests.
Can be applied to multiple routes: Middleware is reusable across different endpoints.
Example 2: API Response Pagination
Code:
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\UserController;
Route::get('/users', [UserController::class, 'index']);
?>
//----------------------------------------------------------------//
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\User;
class UserController extends Controller
{
public function index()
{
return response()->json(User::paginate(10));
}
}
?>
Explanation:
Uses Laravel's pagination feature: Limits API responses to 10 users per page.
Reduces database load: Fetching limited records improves performance.
Supports automatic pagination metadata: Laravel includes
next_page_url
andprevious_page_url
.Improves frontend usability: API consumers can navigate paginated data easily.
Optimizes large datasets: Avoids performance issues when handling thousands of records.
Example 3: Scheduled Task for Cleaning Logs
Code:
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;
class ClearLogs extends Command
{
protected $signature = 'logs:clear';
protected $description = 'Deletes old log files';
public function handle()
{
Storage::deleteDirectory('logs');
Log::info('Logs cleared successfully.');
}
}
?>
//----------------------------------------------------------------//
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
protected function schedule(Schedule $schedule)
{
$schedule->command('logs:clear')->daily();
}
}
?>
Explanation:
Creates a custom Artisan command:
logs:clear
removes old log files.Automates log file maintenance: Reduces storage bloat by removing unnecessary logs.
Uses Laravel scheduler: The command runs automatically every day.
Improves system performance: Keeps logs clean and manageable.
Can be extended for other cleanup tasks: Useful for cache clearing and database optimizations.
Example 4: Event Listener for User Actions
Code:
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\UserActionController;
Route::post('/action', [UserActionController::class, 'performAction']);
?>
//----------------------------------------------------------------//
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Events\UserPerformedAction;
class UserActionController extends Controller
{
public function performAction(Request $request)
{
event(new UserPerformedAction($request->user(), $request->action));
return response()->json(['message' => 'Action recorded']);
}
}
?>
//----------------------------------------------------------------//
<?php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class UserPerformedAction
{
use Dispatchable, SerializesModels;
public $user;
public $action;
public function __construct($user, $action)
{
$this->user = $user;
$this->action = $action;
}
public function broadcastOn()
{
return new Channel('user-actions');
}
}
?>
Explanation:
Uses Laravel’s event-driven system: Sends event notifications when users perform actions.
Records user activities efficiently: Logs or processes actions asynchronously.
Enhances scalability: Allows multiple listeners to process events separately.
Supports real-time notifications: Can be extended with WebSockets.
Keeps controllers lightweight: Event-driven architecture improves code separation.
Example 5: API Localization for Multi-Language Support
Code:
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\LocalizationController;
Route::get('/welcome', [LocalizationController::class, 'index']);
?>
//----------------------------------------------------------------//
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class LocalizationController extends Controller
{
public function index()
{
return response()->json(['message' => __('messages.welcome')]);
}
}
?>
//----------------------------------------------------------------//
// resources/lang/en/messages.php
<?php
return [
'welcome' => 'Welcome to our application!'
];
?>
// resources/lang/es/messages.php
<?php
return [
'welcome' => '¡Bienvenido a nuestra aplicación!'
];
?>
Explanation:
Uses Laravel’s localization feature: Translates API responses dynamically.
Supports multiple languages: Stores translations in separate language files.
Improves user experience: Provides language-specific messages based on user preferences.
Uses the
__()
helper function: Easily fetches localized strings.Extensible for future languages: Can add new languages without modifying API logic.
Conclusion
These five examples cover custom middleware, API pagination, task scheduling, event-driven systems, and localization—all essential for building high-performance Laravel applications.