NexaController menyediakan sistem state management yang powerful untuk menyimpan dan mengelola data state selama siklus hidup aplikasi. Fitur ini sangat berguna untuk menyimpan data sementara antar request, seperti filter pencarian, pengaturan tampilan, dan preferensi user.
NexaController menyediakan beberapa metode untuk mengelola state:
useState(string $key, mixed $defaultValue = null)
- Mendapatkan dan mengatur stategetState(string $key, mixed $defaultValue = null)
- Mendapatkan nilai statesetState(string $key, mixed $value)
- Mengatur nilai stateclearState(string $key)
- Menghapus statehasState(string $key)
- Memeriksa keberadaan state
Method useState()
adalah cara paling mudah untuk bekerja dengan state. Method ini
mengembalikan array dengan dua elemen: nilai state saat ini dan fungsi untuk mengubah state.
public function listProducts(): void
{
// Menggunakan state untuk menyimpan filter pencarian
[$filters, $setFilters] = $this->useState('product_filters', [
'category' => 'all',
'sort' => 'newest',
'page' => 1
]);
// Update filter jika ada request baru
if ($this->isPost()) {
$newFilters = [
'category' => $this->getPost('category', $filters['category']),
'sort' => $this->getPost('sort', $filters['sort']),
'page' => (int)$this->getPost('page', $filters['page'])
];
$setFilters($newFilters);
$filters = $newFilters;
}
// Gunakan filter untuk mendapatkan data
$products = $this->useModels('Product', 'getFiltered', [$filters]);
$this->assignVars([
'products' => $products,
'filters' => $filters
]);
$this->render('products/list');
}
NexaController juga menyediakan beberapa specialized state hooks:
useCounter(string $key, int $initialValue = 0)
- State untuk nilai numerik dengan operasi increment/decrementuseToggle(string $key, bool $initialValue = false)
- State untuk nilai boolean yang dapat di-toggleuseArray(string $key, array $initialValue = [])
- State untuk array dengan operasi khusus array
public function productView(): void
{
// Menggunakan counter untuk menghitung view
[$viewCount, $counterActions] = $this->useCounter('product_views', 0);
// Increment view count
$counterActions->increment();
// Menggunakan toggle untuk status favorit
[$isFavorite, $toggleFavorite] = $this->useToggle('is_favorite', false);
if ($this->getParam('toggle_favorite') === '1') {
$toggleFavorite();
}
$this->assignVars([
'view_count' => $viewCount,
'is_favorite' => $isFavorite
]);
$this->render('products/view');
}
Anda dapat menetapkan state langsung ke template menggunakan assignStates()
:
public function dashboard(): void
{
// Menetapkan beberapa state ke template
$this->assignStates(['user_preferences', 'dashboard_layout', 'widget_settings']);
// Atau dengan prefix kustom
$this->assignStates(['notifications', 'messages'], 'app_');
$this->render('dashboard/index');
}
Di template, state akan tersedia sebagai variabel dengan nama yang sesuai atau dengan prefix yang ditentukan:
<div class="dashboard" data-layout="{{dashboard_layout}}">
<!-- Widget settings tersedia sebagai variabel widget_settings -->
{{#each widget_settings}}
<div class="widget" data-type="{{type}}" data-position="{{position}}">
{{title}}
</div>
{{/each}}
<!-- Notifikasi dengan prefix app_ -->
{{#if app_notifications}}
<div class="notification-panel">
{{app_notifications.count}} notifikasi baru
</div>
{{/if}}
</div>
Untuk debugging, NexaController menyediakan method untuk melihat state:
debugState(string $key = null)
- Mendapatkan informasi state dalam bentuk arraydebugStateDisplay(string $key = null)
- Menampilkan informasi state
public function debug(): void
{
if ($this->isGet('show_state')) {
$this->debugStateDisplay();
exit;
}
// Lanjutkan dengan normal rendering
$this->render('debug/index');
}
Berikut adalah beberapa praktik terbaik dalam menggunakan state management:
clearState()