Installation:
composer require jambasangsang/flash
(Skip service provider registration if using Laravel ≥5.6 with auto-discovery.)
Publish Config:
php artisan vendor:publish --provider="Jambasangsang\Flash\FlashNotificationServiceProvider" --tag="flash-config"
(Located at config/flash.php.)
First Use Case: Trigger a basic success flash in a controller:
use Jambasangsang\Flash\Facades\Flash;
public function store(Request $request) {
$validated = $request->validate([...]);
// ...
Flash::success('Record saved successfully!');
return redirect()->back();
}
config/flash.php (customize types, durations, or default messages).Flash::type('message') (e.g., success(), error(), warning()).resources/views/vendor/flash/flash.blade.php (override if needed).Triggering Flashes:
// Basic usage
Flash::success('Action completed!');
Flash::error('Invalid input.')->important(); // Chaining modifiers
// With data (e.g., for JS handling)
Flash::info('Updated!', ['key' => 'value']);
Conditional Flashes:
if ($user->save()) {
Flash::success('Profile updated.');
} else {
Flash::error('Update failed.');
}
Redirect Integration:
return redirect()->route('dashboard')
->withFlash('Welcome back!', 'info');
Custom Types:
Define in config/flash.php:
'types' => [
'custom' => [
'title' => 'Custom Alert',
'icon' => 'fas fa-rocket',
],
],
Usage:
Flash::custom('This is a custom flash!');
Blade Overrides: Extend the default template by publishing views:
php artisan vendor:publish --tag="flash-views"
(Edit resources/views/vendor/flash/flash.blade.php.)
JavaScript Handling:
Pass data to JS via with():
Flash::success('Data saved', ['redirect' => route('dashboard')]);
Access in JS:
@if(session()->has('flash_data'))
const data = @json(session('flash_data'));
if (data.redirect) window.location.href = data.redirect;
@endif
Middleware for Global Flashes:
public function handle($request, Closure $next) {
if ($request->user()->justRegistered()) {
Flash::success('Registration complete!');
}
return $next($request);
}
Testing:
$this->get('/route')
->assertSessionHas('flash', ['type' => 'success', 'message' => '...']);
Session Dependency:
SESSION_DRIVER is configured (e.g., file, redis).config/session.php and clear old sessions if flashes persist unexpectedly:
php artisan session:clear
Template Overrides Not Loading:
resources/views/vendor/flash/flash.blade.php.@extends directive (default extends layouts.app).{{ dd('Flash template loaded') }} to the view.Chaining Methods:
important() or autoDismiss() must be chained immediately after the type call:
// Works
Flash::success('Test')->important();
// Fails (returns null)
$flash = Flash::success('Test');
$flash->important(); // Error: Call to undefined method
CSRF Conflicts:
return redirect()->route('dashboard')->withFlash('...')->withHeaders([
'X-CSRF-TOKEN' => csrf_token(),
]);
Inspect Session Data: Dump the session to verify flashes are stored:
dd(session()->all());
Look for flash or flash_data keys.
Check Config Overrides:
Ensure no other packages (e.g., laravel-notification-channels) are overriding flash behavior.
Clear Published Config:
If changes to config/flash.php don’t apply, republish:
php artisan config:clear
Custom Flash Types:
Extend the FlashNotificationServiceProvider to add dynamic types:
// In a service provider
public function boot() {
Flash::extend('dynamic', function ($message, $data) {
return [
'type' => 'dynamic',
'message' => $message,
'data' => $data,
'title' => 'Dynamic Alert',
];
});
}
Queue Flashes for Async Processing: Use Laravel queues to delay flash messages:
Flash::queue('Processing...')->delay(now()->addMinutes(1));
(Requires custom queue listener implementation.)
Localization:
Localize messages via language files (resources/lang/en/flash.php):
return [
'success' => 'Operation completed successfully.',
];
Usage:
Flash::success(__('flash.success'));
Dark Mode Support:
Add a dark modifier to the config:
'types' => [
'success' => [
'title' => 'Success',
'icon' => 'fas fa-check',
'classes' => 'bg-green-500 text-white dark:bg-green-700',
],
],
How can I help you explore Laravel packages today?