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:
Uses Laravel’s event system: When a new user registers, the
UserRegistered
event is triggered.Dispatches an event after registration: The
event()
function sends user data to event listeners.Event system improves scalability: Decouples logic by handling actions asynchronously.
Makes code modular and readable: The event-driven approach organizes business logic cleanly.
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:
Uses Laravel caching: Improves performance by reducing database queries.
Caches posts for an hour: Uses
Cache::remember()
to store posts for 3600 seconds.Reduces server load: Prevents redundant database fetches, improving API response speed.
Ensures fresh data is retrieved: The cache expires after a specific time, ensuring up-to-date content.
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:
Creates a custom artisan command: The
cleanup:records
command runs scheduled tasks.Performs cleanup operations: Automates database maintenance by removing outdated records.
Uses Laravel’s logging system: Logs the cleanup process for debugging and monitoring.
Can be scheduled via cron: Easily run at specific intervals via
php artisan schedule:run
.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:
Uses Laravel’s notification system:
notify()
simplifies sending emails, SMS, and database notifications.Supports multiple delivery channels: Can send via email, SMS, or database storage.
Customizes email content dynamically: The
MailMessage
class structures personalized emails.Easy integration with Laravel models: Users can directly receive notifications with
notify()
.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:
Implements WebSockets for real-time chat: Uses Laravel Echo and Pusher for real-time messaging.
Broadcasts messages to channels: The
ChatMessageSent
event transmits data via thechat
channel.Improves user experience: Enables instant messaging without page reloads.
Scales with Laravel broadcasting: Can handle thousands of concurrent connections.
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.