Session Handling

Pengenalan Session Management

Session management adalah cara untuk menyimpan data pengguna selama mereka berinteraksi dengan aplikasi. NexaController menyediakan berbagai method untuk mengelola session dengan mudah dan aman.

Method Session

NexaController menyediakan beberapa method untuk mengelola session:

  • getSession() - Mendapatkan instance NexaSession
  • setSession(string $key, $value) - Menyimpan data ke session
  • getSessionValue(string $key, $default = null) - Mendapatkan nilai dari session
  • hasSession(string $key) - Memeriksa keberadaan key di session
  • removeSession(string $key) - Menghapus data dari session

Menggunakan Session

Berikut adalah contoh penggunaan session dalam controller:


public function login(): void
{
    if ($this->isPost()) {
        $email = $this->getPost('email');
        $password = $this->getPost('password');
        
        $user = $this->useModels('User', 'authenticate', [$email, $password]);
        
        if ($user) {
            // Simpan data user ke session
            $this->setSession('user_id', $user['id']);
            $this->setSession('user_name', $user['name']);
            $this->setSession('user_email', $user['email']);
            $this->setSession('is_logged_in', true);
            
            // Redirect ke dashboard
            $this->redirect('/dashboard');
            return;
        } else {
            $this->setFlash('error', 'Email atau password salah');
        }
    }
    
    $this->render('auth/login');
}

public function dashboard(): void
{
    // Cek apakah user sudah login
    if (!$this->hasSession('is_logged_in')) {
        $this->redirect('/login');
        return;
    }
    
    // Ambil data user dari session
    $userId = $this->getSessionValue('user_id');
    $userName = $this->getSessionValue('user_name');
    
    // Tampilkan dashboard dengan data user
    $this->assignVars([
        'user_id' => $userId,
        'user_name' => $userName
    ]);
    
    $this->render('dashboard/index');
}

public function logout(): void
{
    // Hapus data user dari session
    $this->removeSession('user_id');
    $this->removeSession('user_name');
    $this->removeSession('user_email');
    $this->removeSession('is_logged_in');
    
    // Atau hapus semua data session
    $this->getSession()->destroy();
    
    $this->redirect('/login');
}
        

User Authentication

NexaController menyediakan method khusus untuk autentikasi user:

  • isLoggedIn() - Memeriksa apakah user sudah login
  • getUser() - Mendapatkan data user yang sedang login
  • setUser(array $userData) - Menyimpan data user ke session
  • setLogout() - Logout user

public function login(): void
{
    if ($this->isPost()) {
        $email = $this->getPost('email');
        $password = $this->getPost('password');
        
        $user = $this->useModels('User', 'authenticate', [$email, $password]);
        
        if ($user) {
            // Simpan data user menggunakan method setUser
            $this->setUser($user);
            
            // Redirect ke dashboard
            $this->redirect('/dashboard');
            return;
        } else {
            $this->setFlash('error', 'Email atau password salah');
        }
    }
    
    $this->render('auth/login');
}

public function dashboard(): void
{
    // Cek apakah user sudah login menggunakan method isLoggedIn
    if (!$this->isLoggedIn()) {
        $this->redirect('/login');
        return;
    }
    
    // Ambil data user menggunakan method getUser
    $user = $this->getUser();
    
    // Tampilkan dashboard dengan data user
    $this->assignVars([
        'user' => $user
    ]);
    
    $this->render('dashboard/index');
}

public function logout(): void
{
    // Logout user menggunakan method setLogout
    $this->setLogout();
    
    $this->redirect('/login');
}
        

Flash Messages

Flash messages adalah pesan yang hanya ditampilkan sekali setelah redirect. NexaController menyediakan method untuk mengelola flash messages:

  • setFlash(string $type, string $message) - Menyimpan flash message
  • getFlash() - Mendapatkan semua flash messages
  • assignFlash() - Menetapkan flash messages ke template

public function processForm(): void
{
    if ($this->isPost()) {
        // Proses form
        $result = $this->useModels('Form', 'process', [$this->getPost()]);
        
        if ($result['success']) {
            // Set flash message untuk sukses
            $this->setFlash('success', 'Form berhasil diproses');
        } else {
            // Set flash message untuk error
            $this->setFlash('error', 'Terjadi kesalahan dalam memproses form');
        }
        
        // Redirect ke halaman lain
        $this->redirect('/form/result');
        return;
    }
    
    $this->render('form/index');
}

public function formResult(): void
{
    // Assign flash messages ke template
    $this->assignFlash();
    
    // Atau ambil flash messages secara manual
    $flashMessages = $this->getFlash();
    $this->assignVars([
        'messages' => $flashMessages
    ]);
    
    $this->render('form/result');
}
        

Session Security

Beberapa tips keamanan untuk session:

  • Jangan menyimpan data sensitif seperti password di session
  • Gunakan HTTPS untuk mencegah session hijacking
  • Regenerate session ID setelah login untuk mencegah session fixation
  • Set session timeout yang sesuai dengan kebutuhan aplikasi
  • Hapus session secara eksplisit setelah logout

public function login(): void
{
    if ($this->isPost() && $this->validateLogin()) {
        // Regenerate session ID untuk mencegah session fixation
        $this->getSession()->regenerateId();
        
        // Set session timeout (30 menit)
        $this->getSession()->setTimeout(1800);
        
        // Simpan data user
        $this->setUser($user);
        
        $this->redirect('/dashboard');
    }
    
    $this->render('auth/login');
}
        

Advanced Session Management

Untuk kasus yang lebih kompleks, Anda dapat mengakses langsung instance NexaSession:


public function advancedSession(): void
{
    // Mendapatkan instance NexaSession
    $session = $this->getSession();
    
    // Operasi langsung pada session
    $session->set('complex_data', [
        'preferences' => [
            'theme' => 'dark',
            'language' => 'id',
            'notifications' => true
        ],
        'permissions' => [
            'admin' => false,
            'editor' => true
        ]
    ]);
    
    // Mendapatkan data nested
    $theme = $session->get('complex_data.preferences.theme');
    $isEditor = $session->get('complex_data.permissions.editor');
    
    // Mengubah data nested
    $session->set('complex_data.preferences.theme', 'light');
    
    // Memeriksa keberadaan data nested
    if ($session->has('complex_data.permissions.admin')) {
        // Do something
    }
    
    // Menghapus data nested
    $session->remove('complex_data.permissions.editor');
    
    // Mengatur flash data (hanya tersedia untuk satu request)
    $session->setFlash('notification', 'Pengaturan berhasil disimpan');
    
    // Mengatur session timeout
    $session->setTimeout(3600); // 1 jam
    
    // Regenerate session ID
    $session->regenerateId();
    
    // Destroy session
    $session->destroy();
}
        

Best Practices

Berikut adalah beberapa praktik terbaik dalam mengelola session:

  • Gunakan method isLoggedIn(), getUser(), setUser(), dan setLogout() untuk autentikasi user
  • Gunakan flash messages untuk memberikan feedback ke user setelah redirect
  • Jangan menyimpan terlalu banyak data di session untuk menghindari overhead
  • Gunakan session untuk data yang perlu dipertahankan selama user berinteraksi dengan aplikasi
  • Gunakan state management untuk data sementara yang hanya diperlukan dalam beberapa request
  • Selalu validasi data yang diambil dari session sebelum digunakan