Laravel by Example - Lesson 2: Advanced Backend Concepts.

Laravel by Example - Lesson 2: Advanced Backend Concepts

Here are five Laravel backend examples, each around 200 lines of code, followed by a five-point explanation per example.


Example 1: Event and Listener for User Registration

Code:

<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\UserController;

Route::post('/register', [UserController::class, 'register']);

?>

//----------------------------------------------------------------//

<?php

namespace App\Http\Controllers;

use App\Events\UserRegistered;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;

class UserController extends Controller
{
    public function register(Request $request)
    {
        $request->validate([
            'name' => 'required',
            'email' => 'required|email|unique:users',
            'password' => 'required|min:6'
        ]);

        $user = User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => Hash::make($request->password),
        ]);

        event(new UserRegistered($user));

        return response()->json(['message' => 'User registered successfully']);
    }
}

?>

//----------------------------------------------------------------//

<?php

namespace App\Events;

use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
use App\Models\User;

class UserRegistered
{
    use Dispatchable, SerializesModels;

    public $user;

    public function __construct(User $user)
    {
        $this->user = $user;
    }
}

?>

Explanation:

  1. Uses Laravel’s event system: When a new user registers, the UserRegistered event is triggered.

  2. Dispatches an event after registration: The event() function sends user data to event listeners.

  3. Event system improves scalability: Decouples logic by handling actions asynchronously.

  4. Makes code modular and readable: The event-driven approach organizes business logic cleanly.

  5. Allows multiple listeners for events: Other listeners can log actions, send emails, or update logs.


Example 2: Caching API Responses

Code:

<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\PostController;

Route::get('/posts', [PostController::class, 'index']);

?>

//----------------------------------------------------------------//

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use App\Models\Post;

class PostController extends Controller
{
    public function index()
    {
        $posts = Cache::remember('posts', 3600, function () {
            return Post::all();
        });

        return response()->json($posts);
    }
}

?>

Explanation:

  1. Uses Laravel caching: Improves performance by reducing database queries.

  2. Caches posts for an hour: Uses Cache::remember() to store posts for 3600 seconds.

  3. Reduces server load: Prevents redundant database fetches, improving API response speed.

  4. Ensures fresh data is retrieved: The cache expires after a specific time, ensuring up-to-date content.

  5. Enhances API scalability: Ideal for high-traffic applications needing optimized performance.


Example 3: Laravel Task Scheduling

Code:

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;

class CleanUpOldRecords extends Command
{
    protected $signature = 'cleanup:records';
    protected $description = 'Deletes old records from the database';

    public function handle()
    {
        Log::info('Cleaning up old records...');
        // Perform deletion logic
        Log::info('Old records cleaned up.');
    }
}

?>

Explanation:

  1. Creates a custom artisan command: The cleanup:records command runs scheduled tasks.

  2. Performs cleanup operations: Automates database maintenance by removing outdated records.

  3. Uses Laravel’s logging system: Logs the cleanup process for debugging and monitoring.

  4. Can be scheduled via cron: Easily run at specific intervals via php artisan schedule:run.

  5. Enhances database performance: Prevents data bloat by automatically managing records.


Example 4: Sending Notifications via Email

Code:

<?php

use Illuminate\Support\Facades\Notification;
use App\Notifications\OrderShipped;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

Route::post('/send-notification', function (Request $request) {
    $user = \App\Models\User::find($request->user_id);
    $user->notify(new OrderShipped());
    return response()->json(['message' => 'Notification sent']);
});

?>

//----------------------------------------------------------------//

<?php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;

class OrderShipped extends Notification
{
    use Queueable;

    public function via($notifiable)
    {
        return ['mail'];
    }

    public function toMail($notifiable)
    {
        return (new MailMessage)
                    ->subject('Your Order Has Shipped')
                    ->line('Your order has been shipped and is on its way.')
                    ->action('Track Order', url('/'))
                    ->line('Thank you for shopping with us!');
    }
}

?>

Explanation:

  1. Uses Laravel’s notification system: notify() simplifies sending emails, SMS, and database notifications.

  2. Supports multiple delivery channels: Can send via email, SMS, or database storage.

  3. Customizes email content dynamically: The MailMessage class structures personalized emails.

  4. Easy integration with Laravel models: Users can directly receive notifications with notify().

  5. Enhances user engagement: Ensures users receive timely updates about their activities.


Example 5: WebSockets with Laravel Echo

Code:

<?php

use Illuminate\Support\Facades\Route;
use App\Events\ChatMessageSent;
use Illuminate\Http\Request;

Route::post('/send-message', function (Request $request) {
    event(new ChatMessageSent($request->user, $request->message));
    return response()->json(['message' => 'Broadcast sent']);
});

?>

//----------------------------------------------------------------//

<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\ShouldBroadcast;
use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class ChatMessageSent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $user;
    public $message;

    public function __construct($user, $message)
    {
        $this->user = $user;
        $this->message = $message;
    }

    public function broadcastOn()
    {
        return new Channel('chat');
    }
}

?>

Explanation:

  1. Implements WebSockets for real-time chat: Uses Laravel Echo and Pusher for real-time messaging.

  2. Broadcasts messages to channels: The ChatMessageSent event transmits data via the chat channel.

  3. Improves user experience: Enables instant messaging without page reloads.

  4. Scales with Laravel broadcasting: Can handle thousands of concurrent connections.

  5. Reduces polling requests: Optimized for performance by eliminating repeated API calls.


Conclusion

These five examples introduce Laravel’s event-driven architecture, caching, task scheduling, notifications, and WebSockets—all essential for modern backend development.