Session management adalah cara untuk menyimpan data pengguna selama mereka berinteraksi dengan aplikasi. NexaController menyediakan berbagai method untuk mengelola session dengan mudah dan aman.
NexaController menyediakan beberapa method untuk mengelola session:
getSession()
- Mendapatkan instance NexaSessionsetSession(string $key, $value)
- Menyimpan data ke sessiongetSessionValue(string $key, $default = null)
- Mendapatkan nilai dari sessionhasSession(string $key)
- Memeriksa keberadaan key di sessionremoveSession(string $key)
- Menghapus data dari sessionBerikut 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');
}
NexaController menyediakan method khusus untuk autentikasi user:
isLoggedIn()
- Memeriksa apakah user sudah logingetUser()
- Mendapatkan data user yang sedang loginsetUser(array $userData)
- Menyimpan data user ke sessionsetLogout()
- 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 adalah pesan yang hanya ditampilkan sekali setelah redirect. NexaController menyediakan method untuk mengelola flash messages:
setFlash(string $type, string $message)
- Menyimpan flash messagegetFlash()
- Mendapatkan semua flash messagesassignFlash()
- 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');
}
Beberapa tips keamanan untuk session:
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');
}
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();
}
Berikut adalah beberapa praktik terbaik dalam mengelola session:
isLoggedIn()
, getUser()
, setUser()
, dan setLogout()
untuk autentikasi user