Session

ZephyrPHP provides a simple, secure session management system for storing user data across requests.

Configuration

Configure sessions in config/session.php:

<?php

return [
    'name' => env('SESSION_NAME', 'zephyr_session'),
    'lifetime' => env('SESSION_LIFETIME', 120), // minutes
    'path' => '/',
    'domain' => env('SESSION_DOMAIN', null),
    'secure' => env('SESSION_SECURE', false),
    'httponly' => true,
    'samesite' => 'Lax',
];

Basic Usage

Accessing the Session

// In a controller
$value = $this->session->get('key');

// Using the helper function
$value = session('key');

// With default value
$value = session('key', 'default');

Storing Data

// Set a value
$this->session->set('user_id', 123);

// Set multiple values
$this->session->set('user', [
    'id' => 123,
    'name' => 'John Doe'
]);

Retrieving Data

// Get a value
$userId = $this->session->get('user_id');

// Get with default
$role = $this->session->get('role', 'guest');

// Check if key exists
if ($this->session->has('user_id')) {
    // User is logged in
}

Removing Data

// Remove a single key
$this->session->remove('temporary_data');

// Clear all session data
$this->session->clear();

// Destroy the session completely
$this->session->destroy();

Flash Messages

Flash data is available only for the next request, perfect for status messages:

Setting Flash Messages

// In your controller
$this->flash('success', 'User created successfully!');
$this->flash('error', 'Something went wrong.');
$this->flash('warning', 'Please review your input.');
$this->flash('info', 'Your session will expire soon.');

return $this->redirect('/users');

Displaying Flash Messages

{% if session('flash_success') %}
    <div class="alert alert-success">
        {{ session('flash_success') }}
    </div>
{% endif %}

{% if session('flash_error') %}
    <div class="alert alert-danger">
        {{ session('flash_error') }}
    </div>
{% endif %}

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

{% if session('flash_info') %}
    <div class="alert alert-info">
        {{ session('flash_info') }}
    </div>
{% endif %}

Reusable Flash Component

pages/partials/flash.twig
{% set flashTypes = ['success', 'error', 'warning', 'info'] %}

{% for type in flashTypes %}
    {% set message = session('flash_' ~ type) %}
    {% if message %}
        <div class="alert alert-{{ type == 'error' ? 'danger' : type }}">
            {{ message }}
        </div>
    {% endif %}
{% endfor %}

Then include it in your layouts:

{% include 'partials/flash.twig' %}

CSRF Tokens

Get and verify CSRF tokens through the session:

// Get the current CSRF token
$token = $this->session->csrf();

// Regenerate the CSRF token
$newToken = $this->session->regenerateCsrf();

// Verify a submitted token
if ($this->session->verifyCsrf($submittedToken)) {
    // Token is valid
}

Old Input

Preserve form input after validation failures:

Flashing Input

// When validation fails
$this->session->flashInput($this->request->all());

Retrieving Old Input

// In your controller
$name = $this->session->getOldInput('name');

// In Twig templates
<input type="text" name="name" value="{{ old('name') }}">

Session in Templates

Access session data in Twig templates:

{# Get session value #}
{{ session('user_name') }}

{# Check if exists #}
{% if session('user_id') %}
    Welcome back!
{% endif %}

{# With default #}
{{ session('theme', 'light') }}

Authentication Example

Common session patterns for authentication:

<?php

class AuthController extends Controller
{
    public function login()
    {
        $credentials = $this->validate([
            'email' => 'required|email',
            'password' => 'required',
        ]);

        $user = User::findOneBy(['email' => $credentials['email']]);

        if (!$user || !password_verify($credentials['password'], $user->password)) {
            $this->flash('error', 'Invalid credentials');
            return $this->back();
        }

        // Store user in session
        $this->session->set('user_id', $user->id);
        $this->session->set('user_name', $user->name);

        // Regenerate CSRF token
        $this->session->regenerateCsrf();

        $this->flash('success', 'Welcome back!');
        return $this->redirect('/dashboard');
    }

    public function logout()
    {
        $this->session->destroy();

        return $this->redirect('/');
    }

    public function profile()
    {
        if (!$this->session->has('user_id')) {
            return $this->redirect('/login');
        }

        $userId = $this->session->get('user_id');
        $user = User::find($userId);

        return $this->render('profile', ['user' => $user]);
    }
}

Session Security

Regenerating Session ID

Regenerate the session ID after sensitive operations:

// After login
session_regenerate_id(true);

Secure Cookie Settings

# In .env for production
SESSION_SECURE=true  # Requires HTTPS
SESSION_DOMAIN=.yourdomain.com

Session Lifetime

# In .env
SESSION_LIFETIME=120  # 2 hours in minutes

Method Reference

Method Description
get($key, $default) Get a session value
set($key, $value) Set a session value
has($key) Check if key exists
remove($key) Remove a session value
clear() Clear all session data
destroy() Destroy the session
flash($key, $value) Set flash data
csrf() Get CSRF token
verifyCsrf($token) Verify CSRF token
flashInput($data) Flash form input
getOldInput($key) Get old input value