Product Decisions This Supports
- Unified State Management: Enables centralized state handling across microservices, APIs, and frontend-backend integration (e.g., Livewire, Inertia.js, or SPA backends). Reduces redundant caching logic and improves consistency.
- Roadmap for Scalable Architecture: Ideal for transitioning from request-scoped state (e.g., sessions) to application-wide state, supporting future headless or decoupled architectures.
- Build vs. Buy: Avoids reinventing state persistence/caching layers (e.g., Redis, database) for simple use cases while offering flexibility to extend for complex scenarios (e.g., multi-tenant state isolation).
- Use Cases:
- Real-time Systems: Shared state for WebSocket broadcasts, notifications, or collaborative features (e.g., live dashboards).
- Progressive Hydration: Preload state for slow-starting services (e.g., analytics, reporting) without blocking initial requests.
- Legacy Modernization: Gradually replace session-based state in monolithic apps with a more maintainable pattern.
- Testing: Persistent state for integration tests (e.g., seeding complex app state once per test suite).
When to Consider This Package
-
Adopt When:
- Your Laravel app requires shared state across requests/services (e.g., user preferences, app-wide configurations, or transient data like form drafts).
- You need simpler persistence than Redis/Memcached but more control than sessions (e.g., disk-based fallback with automatic rehydration).
- Your team uses Laravel’s ecosystem (e.g., Livewire, Inertia, or API-first apps) and wants to avoid reinventing state management.
- You’re building modular services where state must persist beyond a single request (e.g., background jobs, queues).
-
Look Elsewhere If:
- You need distributed state (e.g., multi-server deployments) → Use Redis or a dedicated cache service.
- Your state is highly volatile (e.g., real-time bidding systems) → Consider in-memory solutions like APCu.
- You’re already using a dedicated state library (e.g., Laravel Nova’s resource state, or a custom solution).
- Your app is serverless (e.g., AWS Lambda) → Stateless design is mandatory; this package assumes persistent storage.
- You need fine-grained access control → Pair with Laravel Policies or extend the package’s
StoreContract.
How to Pitch It (Stakeholders)
For Executives:
"This package lets us treat app state like a single source of truth—whether it’s user settings, feature flags, or collaborative data—without sacrificing performance or scalability. It’s like Redux for Laravel, but built for PHP’s ecosystem. We can reduce technical debt from scattered caching logic, speed up development for shared-state features (e.g., live updates), and future-proof our architecture for headless or microservice setups. The MIT license and active maintenance make it a low-risk, high-reward choice."
For Engineering:
*"This solves the ‘state management tax’ in Laravel by providing a lightweight, Laravel-native way to handle shared state across requests, services, and even files. Key benefits:
- No more reinitializing state: Define it once in a
Store class, and it’s available globally.
- Persistence out of the box: Automatically saves/loads state (supports disk, cache, or custom drivers).
- Type safety: Uses Laravel’s casting system for clean attribute handling (e.g.,
Collection, Carbon).
- Extensible: Add custom methods to stores for domain-specific logic (e.g.,
UserStore::resetSession()).
- Test-friendly: Persistent state means faster test suites and easier debugging.
Use it for:
✅ App-wide configs (e.g., AppSettingsStore)
✅ User-specific state (e.g., UserPreferencesStore)
✅ Collaborative features (e.g., DraftStore for multi-user editing)
Example workflow:
// Define state once
php artisan store:make UserStore
// Use anywhere
UserStore::set('theme', 'dark');
$theme = UserStore::theme; // Automatically cast if needed
// Persists automatically (supports fallbacks)
UserStore::rehydrate(); // Loads from cache/disk
Trade-offs: Not for distributed systems (single-server assumption), but perfect for most Laravel apps. Let’s prototype it for [X use case] and measure impact on [Y metric]."*