1. Events & Listeners
Events and Listeners in Laravel provide a powerful way to decouple different parts of your application, allowing components to communicate without being tightly coupled. Events represent something that has happened (e.g., a user registered), while Listeners handle the logic triggered by those events (e.g., sending a welcome email).
What Are Events & Listeners?
Events: Represent an action or occurrence in your application (e.g., UserRegistered, OrderPlaced).
Listeners: Classes or methods that handle the logic when an event is fired.
Use Case: Sending a welcome email when a user registers, logging user activity, or updating a dashboard when an order is processed.
Why Use Events & Listeners?
Events promote clean, maintainable code by separating concerns. For example, instead of embedding email-sending logic in your registration controller, you can dispatch an event and let a listener handle the email.
Real-Life Example
Imagine an e-commerce platform where, after a user places an order, multiple actions need to occur:
Send a confirmation email to the user.
Notify the warehouse to prepare the order.
Update the inventory.
Log the order for analytics.
Using Events and Listeners, you can trigger these actions independently without cluttering your controller.
Step-by-Step Tutorial
Step 1: Creating an Event
Use the Artisan command to generate an event:
php artisan make:event OrderPlaced
This creates OrderPlaced.php in the app/Events directory:
namespace App\Events;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class OrderPlaced
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $order;
public function __construct($order)
{
$this->order = $order;
}
}
Step 2: Creating a Listener
Generate a listener for the event:
php artisan make:listener SendOrderConfirmation --event=OrderPlaced
This creates SendOrderConfirmation.php in the app/Listeners directory:
namespace App\Listeners;
use App\Events\OrderPlaced;
use Illuminate\Support\Facades\Mail;
use App\Mail\OrderConfirmation;
class SendOrderConfirmation
{
public function handle(OrderPlaced $event)
{
Mail::to($event->order->user->email)->send(new OrderConfirmation($event->order));
}
}
Step 3: Registering Events and Listeners
In app/Providers/EventServiceProvider.php, map the event to its listeners:
protected $listen = [
\App\Events\OrderPlaced::class => [
\App\Listeners\SendOrderConfirmation::class,
\App\Listeners\NotifyWarehouse::class,
\App\Listeners\UpdateInventory::class,
],
];
Step 4: Dispatching the Event
In your controller (e.g., OrderController), dispatch the event:
namespace App\Http\Controllers;
use App\Events\OrderPlaced;
use App\Models\Order;
class OrderController extends Controller
{
public function store(Request $request)
{
$order = Order::create($request->validated());
event(new OrderPlaced($order));
return redirect()->route('orders.show', $order)->with('success', 'Order placed successfully!');
}
}
Step 5: Broadcasting Events (Advanced)
For real-time applications, you can broadcast events to the frontend using Laravel’s broadcasting system. Update the event to implement ShouldBroadcast:
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class OrderPlaced implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $order;
public function __construct($order)
{
$this->order = $order;
}
public function broadcastOn()
{
return new Channel('orders');
}
}
Set up Laravel Echo and Pusher (or another broadcasting driver) on the frontend to listen for this event.
Pros of Events & Listeners
Decoupling: Separates concerns, making code modular and maintainable.
Scalability: Easily add new listeners without modifying existing code.
Real-Time Support: Broadcasting enables real-time updates (e.g., live dashboards).
Testability: Events and listeners are easy to test in isolation.
Cons
Complexity: Beginners may find the setup overwhelming.
Overhead: Small applications may not need the extra layer of abstraction.
Debugging: Tracking event-listener flows can be challenging in large applications.
Alternatives
Direct Method Calls: For simple applications, call methods directly in controllers (less modular).
Observers: Use model observers for database-related events (e.g., created, updated).
Middleware: Handle cross-cutting concerns like logging in middleware.
Best Practices
Name Events Clearly: Use descriptive names (e.g., UserRegistered instead of UserEvent).
Keep Listeners Single-Responsibility: Each listener should handle one task (e.g., sending email, updating inventory).
Use Queues for Heavy Tasks: Offload time-consuming listeners (e.g., email sending) to queues.
Document Events: Maintain a list of events and their listeners for team clarity.
Test Listeners: Write unit tests for listeners to ensure reliability.
Example: Advanced Event Broadcasting
For a real-time order tracking system, broadcast the OrderPlaced event to a dashboard:
// resources/js/app.js
import Echo from 'laravel-echo';
window.Pusher = require('pusher-js');
window.Echo = new Echo({
broadcaster: 'pusher',
key: process.env.MIX_PUSHER_APP_KEY,
cluster: process.env.MIX_PUSHER_APP_CLUSTER,
encrypted: true
});
Echo.channel('orders')
.listen('OrderPlaced', (e) => {
console.log('New order placed:', e.order);
// Update dashboard UI
});
2. Jobs & Queues (Background Processing)
Jobs and Queues in Laravel allow you to offload time-consuming tasks (e.g., sending emails, processing images) to a background process, improving application performance and user experience.
What Are Jobs & Queues?
Jobs: Classes that encapsulate a task to be performed (e.g., ProcessOrder).
Queues: Systems that manage and process jobs asynchronously (e.g., Redis, Database, SQS).
Use Case: Sending emails, generating reports, or processing large datasets.
Real-Life Example
In a video streaming platform, when a user uploads a video, the application needs to:
Encode the video in multiple formats.
Generate thumbnails.
Notify subscribers of the new upload.
These tasks are resource-intensive, so they’re ideal for background processing.
Step-by-Step Tutorial
Step 1: Configure the Queue Driver
Update .env to use a queue driver (e.g., database):
QUEUE_CONNECTION=database
Run the migration to create the jobs table:
php artisan queue:table
php artisan migrate
Step 2: Create a Job
Generate a job using Artisan:
php artisan make:job ProcessVideo
This creates ProcessVideo.php in app/Jobs:
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class ProcessVideo implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $video;
public function __construct($video)
{
$this->video = $video;
}
public function handle()
{
// Simulate video processing
sleep(5); // Replace with actual FFmpeg processing
$this->video->update(['status' => 'processed']);
}
}
Step 3: Dispatch the Job
In your controller (e.g., VideoController):
namespace App\Http\Controllers;
use App\Jobs\ProcessVideo;
use App\Models\Video;
class VideoController extends Controller
{
public function store(Request $request)
{
$video = Video::create($request->validated());
ProcessVideo::dispatch($video);
return redirect()->route('videos.show', $video)->with('success', 'Video is being processed!');
}
}
Step 4: Run the Queue Worker
Start the queue worker to process jobs:
php artisan queue:work
For production, use a process manager like Supervisor to keep the worker running.
Step 5: Advanced Queue Features
Delayed Dispatch: Delay job execution:
ProcessVideo::dispatch($video)->delay(now()->addMinutes(10));
Queue Prioritization: Specify queue priority in .env:
QUEUE_PRIORITIES=high,medium,low
Dispatch to a specific queue:
ProcessVideo::dispatch($video)->onQueue('high');
Job Chaining: Chain multiple jobs:
ProcessVideo::withChain([
new GenerateThumbnail($video),
new NotifySubscribers($video)
])->dispatch($video);
Pros of Jobs & Queues
Performance: Offload heavy tasks to improve response times.
Scalability: Handle large workloads with multiple workers.
Reliability: Failed jobs can be retried automatically.
Flexibility: Support multiple drivers (Redis, SQS, Database).
Cons
Setup Complexity: Requires configuring queue drivers and workers.
Resource Usage: Workers consume server resources.
Monitoring: Requires tools like Laravel Horizon for large-scale applications.
Alternatives
Synchronous Processing: Execute tasks directly in the controller (suitable for small tasks but slows down responses).
Cron Jobs: Use cron for scheduled tasks (less flexible than queues).
Third-Party Services: Use services like AWS Lambda for serverless processing.
Best Practices
Use Specific Queues: Assign tasks to different queues (e.g., email, video) for prioritization.
Handle Failures: Implement failed method in jobs to log or notify on failure.
Monitor Queues: Use Laravel Horizon or Telescope for real-time monitoring.
Optimize Workers: Configure Supervisor for production to manage workers.
Test Jobs: Write tests to ensure jobs execute correctly.
Example: Job with Retry and Failure Handling
Add retry logic and failure handling to the ProcessVideo job:
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Log;
class ProcessVideo implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $tries = 3; // Retry up to 3 times
public $timeout = 120; // Timeout after 120 seconds
public $video;
public function __construct($video)
{
$this->video = $video;
}
public function handle()
{
try {
// Simulate video processing
sleep(5);
$this->video->update(['status' => 'processed']);
} catch (\Exception $e) {
$this->fail($e); // Mark job as failed
}
}
public function failed(\Exception $e)
{
Log::error('Video processing failed for video ID: ' . $this->video->id, ['error' => $e->getMessage()]);
// Notify admin or retry logic
}
}
3. Notifications
Notifications in Laravel provide a unified way to send messages to users via multiple channels, such as email, SMS, Slack, or database notifications.
What Are Notifications?
Notifications are classes that define how to send messages to users. They support multiple channels and are highly customizable.
Real-Life Example
In a project management tool, when a task is assigned to a user, you might:
Send an email with task details.
Send a Slack message to the team channel.
Store a notification in the database for the user’s dashboard.
Step-by-Step Tutorial
Step 1: Create a Notification
Generate a notification using Artisan:
php artisan make:notification TaskAssigned
This creates TaskAssigned.php in app/Notifications:
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
class TaskAssigned extends Notification
{
use Queueable;
public $task;
public function __construct($task)
{
$this->task = $task;
}
public function via($notifiable)
{
return ['mail', 'database', 'slack'];
}
public function toMail($notifiable)
{
return (new MailMessage)
->subject('New Task Assigned')
->line('You have been assigned a new task: ' . $this->task->title)
->action('View Task', url('/tasks/' . $this->task->id))
->line('Thank you for using our application!');
}
public function toDatabase($notifiable)
{
return [
'task_id' => $this->task->id,
'title' => 'Task Assigned: ' . $this->task->title,
];
}
public function toSlack($notifiable)
{
return (new \Illuminate\Notifications\Messages\SlackMessage)
->content('New task assigned to ' . $notifiable->name . ': ' . $this->task->title);
}
}
Step 2: Configure Notification Channels
For email, ensure your .env has SMTP settings:
MAIL_MAILER=smtp
MAIL_HOST=smtp.example.com
MAIL_PORT=587
MAIL_USERNAME=your-username
MAIL_PASSWORD=your-password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=from@example.com
For Slack, install the Slack notification channel:
composer require laravel/slack-notification-channel
Configure the Slack webhook in services.php:
'slack' => [
'webhook_url' => env('SLACK_WEBHOOK_URL'),
],
Step 3: Send the Notification
In your controller (e.g., TaskController):
namespace App\Http\Controllers;
use App\Models\Task;
use App\Notifications\TaskAssigned;
class TaskController extends Controller
{
public function assign(Request $request, Task $task)
{
$user = User::find($request->user_id);
$user->notify(new TaskAssigned($task));
return redirect()->route('tasks.show', $task)->with('success', 'Task assigned successfully!');
}
}
Step 4: Display Database Notifications
Retrieve and display notifications in your Blade view:
@foreach (auth()->user()->unreadNotifications as $notification)
<div class="notification">
{{ $notification->data['title'] }}
<a href="{{ url('/tasks/' . $notification->data['task_id']) }}">View</a>
</div>
@endforeach
Step 5: Advanced Notification Features
Custom Channels: Create custom notification channels (e.g., SMS via Twilio):
namespace App\Channels;
use Illuminate\Notifications\Notification;
use Twilio\Rest\Client;
class SmsChannel
{
public function send($notifiable, Notification $notification)
{
$message = $notification->toSms($notifiable);
$twilio = new Client(env('TWILIO_SID'), env('TWILIO_AUTH_TOKEN'));
$twilio->messages->create(
$notifiable->phone_number,
['from' => env('TWILIO_PHONE_NUMBER'), 'body' => $message]
);
}
}
Add the toSms method to your notification:
public function toSms($notifiable)
{
return 'New task assigned: ' . $this->task->title;
}
Pros of Notifications
Multi-Channel Support: Send notifications via email, SMS, Slack, etc.
Customizable: Easily extend with custom channels.
Queueable: Notifications can be queued for performance.
Centralized: Manage all notifications in one place.
Cons
Configuration Overhead: Setting up multiple channels requires external service integration.
Maintenance: Managing multiple channels can become complex.
Cost: External services like Twilio or Slack may incur costs.
Alternatives
Direct API Calls: Use APIs directly (e.g., Twilio SDK) without Laravel’s notification system.
Events: Use events and listeners for simpler notification needs.
Third-Party Services: Use services like Firebase for push notifications.
Best Practices
Queue Notifications: Use queues for email and SMS to avoid delays.
Centralize Configuration: Store API keys in .env for security.
Test Notifications: Write tests to ensure notifications are sent correctly.
User Preferences: Allow users to configure notification preferences (e.g., opt out of emails).
Rate Limiting: Implement rate limiting for SMS or email to avoid abuse.
Example: Notification with Queue
Queue the notification to improve performance:
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
class TaskAssigned extends Notification
{
use Queueable;
public function __construct($task)
{
$this->task = $task;
$this->onQueue('notifications');
}
}
4. Scheduling Tasks with Laravel Scheduler
Laravel’s Scheduler allows you to automate recurring tasks, such as generating reports, cleaning up old data, or sending reminders.
What Is Laravel Scheduler?
The Scheduler is a feature that runs tasks at specified intervals using cron-like syntax. It’s defined in the App\Console\Kernel class.
Real-Life Example
In a subscription-based app, you might:
Send renewal reminders 3 days before a subscription expires.
Generate monthly usage reports.
Clean up expired sessions.
Step-by-Step Tutorial
Step 1: Define a Scheduled Task
In app/Console/Kernel.php, define your scheduled tasks:
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
use App\Models\Subscription;
use App\Notifications\SubscriptionReminder;
class Kernel extends ConsoleKernel
{
protected function schedule(Schedule $schedule)
{
$schedule->call(function () {
$subscriptions = Subscription::where('expires_at', '<=', now()->addDays(3))
->where('expires_at', '>', now())
->get();
foreach ($subscriptions as $subscription) {
$subscription->user->notify(new SubscriptionReminder($subscription));
}
})->daily();
}
}
Step 2: Set Up the Scheduler
Add a cron job to run the scheduler every minute:
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
Use a tool like Supervisor to ensure the cron job runs reliably.
Step 3: Advanced Scheduling
Custom Frequencies: Use methods like everyMinute(), hourly(), weekly(), or cron expressions:
$schedule->command('emails:send')->cron('0 0 * * 1'); // Every Monday at midnight
Prevent Overlaps: Use withoutOverlapping() to prevent concurrent task execution:
$schedule->call(function () {
// Long-running task
})->daily()->withoutOverlapping();
Logging Output: Log task output to a file:
$schedule->command('emails:send')->daily()->appendOutputTo(storage_path('logs/schedule.log'));
Pros of Laravel Scheduler
Ease of Use: Simple syntax for scheduling tasks.
Integration: Works seamlessly with Laravel commands and jobs.
Flexibility: Supports complex scheduling with cron expressions.
Centralized: Manage all scheduled tasks in one place.
Cons
Server Dependency: Requires a cron job to run the scheduler.
Monitoring: No built-in UI for monitoring (use Laravel Horizon or Telescope).
Scalability: Single cron job may not scale for large applications.
Alternatives
Cron Jobs: Write raw cron jobs (less integrated with Laravel).
Third-Party Schedulers: Use tools like AWS CloudWatch Events or Google Cloud Scheduler.
Queue-Based Scheduling: Use queues with delayed dispatch for one-off tasks.
Best Practices
Use Commands: Wrap complex logic in Artisan commands for reusability.
Monitor Tasks: Use logging or tools like Horizon to track task execution.
Handle Failures: Implement error handling in scheduled tasks.
Test Schedules: Test scheduling logic in a local environment.
Secure Cron Jobs: Restrict cron job access to prevent unauthorized execution.
Example: Scheduling a Report Generation
Create an Artisan command for generating reports:
php artisan make:command GenerateMonthlyReport
Define the command in app/Console/Commands/GenerateMonthlyReport.php:
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Models\User;
use App\Exports\MonthlyReportExport;
use Maatwebsite\Excel\Facades\Excel;
class GenerateMonthlyReport extends Command
{
protected $signature = 'report:generate-monthly';
protected $description = 'Generate monthly user activity report';
public function handle()
{
$users = User::all();
Excel::store(new MonthlyReportExport($users), 'reports/monthly-report-' . now()->format('Y-m') . '.xlsx');
$this->info('Monthly report generated successfully!');
}
}
Schedule the command:
$schedule->command('report:generate-monthly')->monthly();
5. Caching & Performance Optimization
Caching improves application performance by storing frequently accessed data in memory, reducing database queries and computation.
What Is Caching?
Caching stores data (e.g., query results, HTML fragments) in a fast-access storage layer (e.g., Redis, Memcached, file-based cache).
Real-Life Example
In a news website, you might cache:
The homepage’s article list to reduce database queries.
API responses to speed up mobile app requests.
Expensive computations like analytics dashboards.
Step-by-Step Tutorial
Step 1: Configure the Cache Driver
Update .env to use Redis or Memcached:
CACHE_DRIVER=redis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
Install the Redis PHP extension:
composer require predis/predis
Step 2: Cache Data
Use Laravel’s Cache facade to store and retrieve data:
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Cache;
use App\Models\Article;
class ArticleController extends Controller
{
public function index()
{
$articles = Cache::remember('articles', now()->addHours(1), function () {
return Article::latest()->take(10)->get();
});
return view('articles.index', compact('articles'));
}
}
Step 3: Cache Invalidation
Manually invalidate the cache when data changes:
Cache::forget('articles');
Or use cache tags for grouped invalidation:
Cache::tags(['articles'])->put('articles.latest', Article::latest()->take(10)->get(), now()->addHours(1));
Cache::tags(['articles'])->flush(); // Invalidate all articles
Step 4: Advanced Caching Techniques
Cache Route Responses: Use middleware to cache entire responses:
Route::get('/articles', [ArticleController::class, 'index'])->middleware('cacheResponse:3600');
Cache Configuration: Cache configuration values to avoid repeated file reads:
config(['app.name' => Cache::remember('app_name', now()->addDays(1), fn () => 'MyApp')]);
Eager Loading: Reduce database queries with Eloquent’s eager loading:
$articles = Article::with('author')->latest()->take(10)->get();
Pros of Caching
Performance: Reduces database and computation load.
Scalability: Handles high traffic with minimal resources.
Flexibility: Supports multiple drivers (Redis, Memcached, file).
Ease of Use: Laravel’s Cache facade is intuitive.
Cons
Stale Data: Improper invalidation can lead to outdated data.
Complexity: Managing cache invalidation requires careful planning.
Cost: Redis or Memcached requires additional server setup.
Alternatives
No Caching: Query the database directly (suitable for low-traffic apps).
CDN Caching: Use a CDN like Cloudflare for static content.
Database Indexing: Optimize queries with indexes instead of caching.
Best Practices
Use Cache Tags: Group related cache entries for easy invalidation.
Set Expiry Times: Avoid indefinite caching to prevent stale data.
Monitor Cache Usage: Use tools like Redis Insight to track cache performance.
Test Cache Logic: Ensure cache invalidation works as expected.
Combine with Eager Loading: Use caching with Eloquent optimizations for maximum performance.
Example: Caching an API Response
Cache an API endpoint response:
namespace App\Http\Controllers\Api;
use Illuminate\Support\Facades\Cache;
use App\Models\User;
class UserController extends Controller
{
public function index()
{
return Cache::remember('users', now()->addMinutes(30), function () {
return User::all();
});
}
}
6. Logging & Debugging
Logging and debugging are critical for monitoring application health, troubleshooting issues, and ensuring reliability.
What Are Logging & Debugging?
Logging: Recording application events, errors, or debug information.
Debugging: Identifying and fixing issues using tools and logs.
Real-Life Example
In a financial application, you might:
Log all transactions for auditing.
Debug payment failures to identify issues.
Monitor API performance to detect bottlenecks.
Step-by-Step Tutorial
Step 1: Configure Logging
Update .env to use a logging driver (e.g., daily):
LOG_CHANNEL=daily
Configure logging in config/logging.php:
return [
'channels' => [
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
'days' => 14,
],
],
];
Step 2: Log Messages
Use the Log facade to log messages:
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Log;
class PaymentController extends Controller
{
public function process(Request $request)
{
try {
// Process payment
Log::info('Payment processed', ['user_id' => auth()->id(), 'amount' => $request->amount]);
} catch (\Exception $e) {
Log::error('Payment failed', ['error' => $e->getMessage(), 'user_id' => auth()->id()]);
throw $e;
}
}
}
Step 3: Debugging with Telescope
Install Laravel Telescope for advanced debugging:
composer require laravel/telescope
php artisan telescope:install
php artisan migrate
Access Telescope at /telescope to view logs, queries, requests, and more.
Step 4: Advanced Logging
Custom Channels: Create a custom logging channel (e.g., Slack):
'channels' => [
'slack' => [
'driver' => 'slack',
'url' => env('LOG_SLACK_WEBHOOK_URL'),
'username' => 'Laravel Logger',
'emoji' => ':boom:',
'level' => 'critical',
],
],
Contextual Logging: Add context to logs:
Log::withContext(['user_id' => auth()->id()])->info('User logged in');
Pros of Logging & Debugging
Visibility: Logs provide insight into application behavior.
Troubleshooting: Debugging tools like Telescope simplify issue resolution.
Auditability: Logs are essential for compliance in sensitive applications.
Scalability: Centralized logging (e.g., ELK stack) supports large apps.
Cons
Storage: Logs can consume significant disk space.
Performance: Excessive logging can slow down the application.
Security: Sensitive data in logs can be a security risk.
Alternatives
Print Statements: Use dd() or var_dump() for quick debugging (not suitable for production).
Third-Party Tools: Use services like Sentry or Loggly for advanced logging.
Database Logging: Store logs in a database (slower but queryable).
Best Practices
Log Levels: Use appropriate log levels (debug, info, warning, error, critical).
Sanitize Logs: Avoid logging sensitive data like passwords.
Rotate Logs: Use daily logging to manage file sizes.
Monitor Logs: Use tools like Telescope or external services for real-time monitoring.
Test Logging: Ensure logs capture the necessary information.
Example: Advanced Logging with Context
Log user actions with context and send critical errors to Slack:
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Log;
class UserController extends Controller
{
public function update(Request $request, User $user)
{
try {
$user->update($request->validated());
Log::withContext(['user_id' => auth()->id(), 'updated_user' => $user->id])
->info('User updated successfully');
} catch (\Exception $e) {
Log::channel('slack')->critical('User update failed', [
'error' => $e->getMessage(),
'user_id' => auth()->id(),
]);
throw $e;
}
}
}
Conclusion
Module 10 of the Laravel Core Complete Course has equipped you with the knowledge and tools to leverage Laravel’s advanced features and services. By mastering Events & Listeners, Jobs & Queues, Notifications, Task Scheduling, Caching, and Logging, you can build scalable, efficient, and maintainable web applications. Each topic was explored with real-world examples, pros and cons, alternatives, and best practices to ensure you can apply these concepts effectively.
Whether you’re building an e-commerce platform, a project management tool, or a video streaming service, these advanced features will help you create robust and user-friendly applications. Keep experimenting, follow best practices, and use tools like Laravel Telescope and Horizon to monitor and optimize your applications.
Happy coding, and stay tuned for more advanced Laravel modules!
No comments:
Post a Comment
Thanks for your valuable comment...........
Md. Mominul Islam