Tutorial Laravel #16: Session dan Flash Message

1. Session di Laravel

Laravel menyediakan API session yang konsisten dan mudah dipakai, terlepas dari driver yang digunakan (file, database, Redis, dll). Konfigurasi session ada di config/session.php dan .env.

2. Menyimpan dan Mengambil Session

use IlluminateHttpRequest;

// Simpan data ke session
$request->session()->put('user_id', 1);
$request->session()->put('preferensi', ['tema' => 'dark', 'bahasa' => 'id']);

// Cara alternatif dengan helper
session(['user_id' => 1, 'nama' => 'Ariq']);
session()->put('kota', 'Semarang');

// Ambil data dari session
$userId = $request->session()->get('user_id');
$tema   = session('preferensi.tema', 'light');   // dengan default value

// Cek apakah session ada
if ($request->session()->has('user_id')) {
    // ada dan tidak null
}
if (session()->exists('user_id')) {
    // ada (meski nilainya null)
}

// Hapus session
$request->session()->forget('user_id');
$request->session()->forget(['user_id', 'nama']);  // hapus beberapa

// Hapus semua session
$request->session()->flush();

3. Flash Message

Flash message adalah session yang hanya hidup untuk satu request berikutnya saja. Sangat cocok untuk notifikasi setelah aksi seperti simpan, update, atau hapus data.

// Simpan flash message
return redirect()->route('artikel.index')
                 ->with('success', 'Artikel berhasil disimpan!');

return redirect()->back()
                 ->with('error', 'Terjadi kesalahan, coba lagi.');

// Bisa juga via session langsung
session()->flash('info', 'Email verifikasi telah dikirim.');
session()->flash('warning', 'Stok produk hampir habis.');

4. Menampilkan Flash Message di Blade

<!-- resources/views/partials/flash.blade.php -->
@if(session('success'))
    <div class="alert alert-success alert-dismissible fade show" role="alert">
        <i class="bi bi-check-circle"></i> {{ session('success') }}
        <button type="button" class="btn-close" data-bs-dismiss="alert"></button>
    </div>
@endif

@if(session('error'))
    <div class="alert alert-danger alert-dismissible fade show" role="alert">
        <i class="bi bi-x-circle"></i> {{ session('error') }}
        <button type="button" class="btn-close" data-bs-dismiss="alert"></button>
    </div>
@endif

@if(session('warning'))
    <div class="alert alert-warning">{{ session('warning') }}</div>
@endif

@if(session('info'))
    <div class="alert alert-info">{{ session('info') }}</div>
@endif
<!-- Sisipkan di layout utama -->
<main class="container my-4">
    @include('partials.flash')
    @yield('content')
</main>

5. Flash untuk Request Berikutnya

// nowFlash - tetap tersedia di request ini dan berikutnya
session()->now('success', 'Data berhasil diproses');

// Reflash - perpanjang flash session satu request lagi
session()->reflash();

// Reflash key tertentu saja
session()->keep(['success', 'error']);

6. Session di Middleware dan Auth

// Simpan URL yang mau diakses sebelum redirect ke login
public function handle(Request $request, Closure $next)
{
    if (!auth()->check()) {
        session()->put('intended_url', $request->url());
        return redirect()->route('login');
    }
    return $next($request);
}

// Setelah login, redirect ke URL yang dituju
return redirect()->intended(route('dashboard'));
// intended() otomatis mengambil session intended_url

7. Ringkasan

  • Gunakan session()->put() untuk menyimpan data ke session
  • Gunakan session()->get() atau helper session('key') untuk membaca
  • Flash message hidup satu request - cocok untuk notifikasi sukses/error
  • Buat partial view untuk flash message agar bisa dipakai di semua halaman

Tutorial berikutnya membahas upload file di Laravel.


ariq fadhil

Im Ariq Tech, a Top Rated Fullstack Developer with 5+ years of experience, delivering high-quality solutions across 50+ projects.