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:

  1. Creates a custom middleware: Logs all incoming API requests for tracking.

  2. Middleware runs before processing requests: The handle() function executes before the request reaches controllers.

  3. Logs request URL and method: Helps monitor API usage and debugging.

  4. Enhances security monitoring: Useful for detecting unusual API requests.

  5. 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:

  1. Uses Laravel's pagination feature: Limits API responses to 10 users per page.

  2. Reduces database load: Fetching limited records improves performance.

  3. Supports automatic pagination metadata: Laravel includes next_page_url and previous_page_url.

  4. Improves frontend usability: API consumers can navigate paginated data easily.

  5. 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:

  1. Creates a custom Artisan command: logs:clear removes old log files.

  2. Automates log file maintenance: Reduces storage bloat by removing unnecessary logs.

  3. Uses Laravel scheduler: The command runs automatically every day.

  4. Improves system performance: Keeps logs clean and manageable.

  5. 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:

  1. Uses Laravel’s event-driven system: Sends event notifications when users perform actions.

  2. Records user activities efficiently: Logs or processes actions asynchronously.

  3. Enhances scalability: Allows multiple listeners to process events separately.

  4. Supports real-time notifications: Can be extended with WebSockets.

  5. 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:

  1. Uses Laravel’s localization feature: Translates API responses dynamically.

  2. Supports multiple languages: Stores translations in separate language files.

  3. Improves user experience: Provides language-specific messages based on user preferences.

  4. Uses the __() helper function: Easily fetches localized strings.

  5. 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.