State Management

Pengenalan State Management

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.

Metode State Management

NexaController menyediakan beberapa metode untuk mengelola state:

  • useState(string $key, mixed $defaultValue = null) - Mendapatkan dan mengatur state
  • getState(string $key, mixed $defaultValue = null) - Mendapatkan nilai state
  • setState(string $key, mixed $value) - Mengatur nilai state
  • clearState(string $key) - Menghapus state
  • hasState(string $key) - Memeriksa keberadaan state

Menggunakan useState

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');
}
        

Specialized State Hooks

NexaController juga menyediakan beberapa specialized state hooks:

  • useCounter(string $key, int $initialValue = 0) - State untuk nilai numerik dengan operasi increment/decrement
  • useToggle(string $key, bool $initialValue = false) - State untuk nilai boolean yang dapat di-toggle
  • useArray(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');
}
        

Menetapkan State ke Template

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>
        

Debug State

Untuk debugging, NexaController menyediakan method untuk melihat state:

  • debugState(string $key = null) - Mendapatkan informasi state dalam bentuk array
  • debugStateDisplay(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');
}
        

Best Practices

Berikut adalah beberapa praktik terbaik dalam menggunakan state management:

  • Gunakan state untuk data yang perlu dipertahankan antar request dalam sesi yang sama
  • Hindari menyimpan data sensitif dalam state
  • Gunakan nama state yang deskriptif dan konsisten
  • Bersihkan state yang tidak diperlukan lagi dengan clearState()
  • Gunakan specialized state hooks untuk kasus penggunaan khusus
  • Pertimbangkan untuk menggunakan session untuk data yang perlu bertahan lebih lama