Laravel does not enforce strict naming conventions for session keys in custom middleware, but the community follows these patterns: use dot notation for namespacing (e.g., middleware.auth.user_id), prefix with middleware name or context, and use snake_case for key names.
Recommended Patterns:
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class CustomAuthMiddleware
{
public function handle(Request $request, Closure $next)
{
// Pattern 1: Namespace with dot notation (recommended)
$request->session()->put('middleware.auth.user_id', 123);
$request->session()->put('middleware.auth.authenticated_at', now());
// Pattern 2: Prefix with middleware name
$request->session()->put('custom_auth_user_id', 123);
// Pattern 3: Descriptive snake_case
$request->session()->put('authenticated_user_id', 123);
$request->session()->put('last_activity_time', now());
// Avoid: Generic keys that might conflict
// $request->session()->put('user', $user); // Too generic
// $request->session()->put('data', $data); // Too vague
return $next($request);
}
}
Laravel's Own Conventions:
Laravel's built-in middleware follows these patterns:
// Auth middleware
session()->put('login.id', $userId); // User ID
session()->put('login.remember', $remember); // Remember me flag
// CSRF token
session()->token(); // '_token' key
// Previous URL
session()->previousUrl(); // 'url.intended' key
// Flash data
session()->flash('status', 'Success!'); // Temporary data
Complete Example:
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class TrackUserActivity
{
public function handle(Request $request, Closure $next)
{
if (Auth::check()) {
// Use namespaced keys for clarity
$request->session()->put('tracking.user_id', Auth::id());
$request->session()->put('tracking.last_activity', now());
$request->session()->put('tracking.current_route', $request->path());
// Store array of recent pages
$recentPages = $request->session()->get('tracking.recent_pages', []);
array_unshift($recentPages, $request->path());
$recentPages = array_slice($recentPages, 0, 5); // Keep last 5
$request->session()->put('tracking.recent_pages', $recentPages);
}
return $next($request);
}
}
// Accessing in controllers
class DashboardController extends Controller
{
public function index(Request $request)
{
$lastActivity = $request->session()->get('tracking.last_activity');
$recentPages = $request->session()->get('tracking.recent_pages', []);
return view('dashboard', compact('lastActivity', 'recentPages'));
}
}
Best Practices:
- ✅ Use dot notation for namespacing:
middleware.feature.key - ✅ Use snake_case for key names
- ✅ Prefix with middleware/feature name to avoid conflicts
- ✅ Be descriptive:
auth_user_idbetter thanuid - ✅ Document session keys in middleware comments
- ❌ Avoid generic keys like
user,data,info - ❌ Don't store large objects directly (use IDs and lazy load)
Session Helper Methods:
// Store data
$request->session()->put('key', 'value');
session(['key' => 'value']); // Alternative
// Retrieve data
$value = $request->session()->get('key');
$value = session('key'); // Alternative
$value = $request->session()->get('key', 'default');
// Check existence
if ($request->session()->has('key')) {
// Key exists
}
if ($request->session()->exists('key')) {
// Key exists (even if null)
}
// Remove data
$request->session()->forget('key');
$request->session()->forget(['key1', 'key2']);
// Flash data (available for next request only)
$request->session()->flash('status', 'Success!');
Version Note: Naming conventions consistent across Laravel 8-11 (2020-2024)