chillerlan/php-settings-container
Lightweight PHP settings container to keep configuration logic out of your app (not a DI container). Provides a SettingsContainerInterface with “property hook”-style access for PHP < 8.4, plus sane defaults for organizing and retrieving settings objects.
config() helper). It replaces mutable arrays with typed, immutable objects, reducing side effects in configuration logic.config() array with typed objects (e.g., config('app') → new AppSettings($config['app'])). Requires minimal changes to existing code if wrapped in a facade.AppSettings::fromJSON(config('settings.json'))).SettingsContainer + Illuminate\Validation) for runtime config checks.Cache::remember('app_settings', ...)).__get/__set may conflict with Laravel’s magic methods (e.g., accessors in Eloquent models). Mitigation: Test in isolation; avoid naming collisions (e.g., get_* methods).Serializable but may clash with Laravel’s serialize()/unserialize() (e.g., in sessions/queues). Mitigation: Prefer toArray()/fromArray() for interoperability.AuthSettings, CacheSettings)?config() array accessors adapt to object-based settings?config_cache (compiled config)?assertArrayHasKey()) to object assertions (e.g., assertObjectHasProperty())?php artisan config:clear interact with immutable objects?ConfigRepository (Laravel’s config handler). The immutable nature aligns with Laravel’s principle of "configuration as data."bind(AppSettings::class, fn() => new AppSettings(config('app')))).Validator via custom rules (e.g., SettingsContainer::validate()).config() mocks with object mocks (e.g., Mockery::mock(AppSettings::class)).SettingsContainer for new features (e.g., FeatureFlagsSettings).Settings::get('feature_flags')) to abstract array/object access.config('app.timezone') → Settings::app()->timezone).ConfigArrayAdapter to bridge old and new systems:
class ConfigArrayAdapter implements ArrayAccess {
private SettingsContainer $container;
// Delegate array access to container properties.
}
config() helper to return SettingsContainer instances.config() will need updates. Solution: Provide a toArray() method on settings objects for backward compatibility..env via fromJSON() or fromArray() after parsing .env files.Cache::forever('settings', $container)).AppSettings container for non-critical features.SettingsValidator::validate($container)).AuthSettings trait).var_dump($container->toArray()) for debugging.tinker introspection).InvalidPropertyException) need documentation for support teams.fromJSON()/toJSON() for serialization.| Scenario | Impact | Mitigation |
|---|---|---|
| Invalid property access | Runtime exception (if ThrowOnInvalidProperty). |
Use isset() checks or try-catch. |
| Serialization errors | Corrupted cached settings. | Validate unserialize() data. |
| Trait conflicts | Method collisions. | Prefix trait methods (e.g., TraitName_set_*). |
| PHP 8.4+ requirement | Blocked on older Laravel versions. | Use a polyfill or feature flag. |
| Cache invalidation | Stale settings in distributed cache. | Use cache tags or versioned keys. |
SettingsContainer instantiations (e.g., new ReloadedBundle\Metrics\SettingsTracker()).How can I help you explore Laravel packages today?