sitesource/laravel-polymorphic-settings
Composer 安装命令:
composer require sitesource/laravel-polymorphic-settings
包简介
Polymorphic, per-model key-value settings for Laravel with opt-in encryption and transparent caching.
关键字:
README 文档
README
Store settings that belong to any model — a team, a user, a tenant, or nothing at all — with opt-in encryption per key and transparent caching.
use SiteSource\PolymorphicSettings\Facades\PolymorphicSettings; PolymorphicSettings::global()->put('site_title', 'Acme'); PolymorphicSettings::for($team)->put('theme', ['mode' => 'dark']); PolymorphicSettings::for($user)->put('api_key', $secret, encrypted: true); PolymorphicSettings::for($team)->get('theme.mode'); // 'dark' $team->settings()->int('max_members', 25); // typed getters
Why another settings package?
Most Laravel settings packages are class-based and global: you define a GeneralSettings class with typed properties, access app(GeneralSettings::class)->site_name. Great when you have a fixed schema and one set of values for your whole app.
This package is key-based and polymorphic: you attach settings to any Eloquent model at runtime. Per-team themes, per-user preferences, per-tenant feature flags, and plain old global settings all live in one table, all accessed through one fluent API.
| Want… | Reach for |
|---|---|
| Strongly-typed, class-based global settings | spatie/laravel-settings |
| Runtime-scoped settings per team/user/tenant, plus encryption | this package |
Installation
composer require sitesource/laravel-polymorphic-settings
Run the installer — it detects your User model's primary key type, publishes the config, publishes the migration, and migrates. Non-interactive runs (CI, --no-interaction) use detected defaults:
php artisan polymorphic-settings:install
Or do each step manually:
php artisan vendor:publish --tag="polymorphic-settings-config" php artisan vendor:publish --tag="polymorphic-settings-migrations" php artisan migrate
Usage
Global settings
use SiteSource\PolymorphicSettings\Facades\PolymorphicSettings; PolymorphicSettings::global()->put('site_title', 'Acme'); PolymorphicSettings::global()->get('site_title'); // 'Acme'
Scoped to any Eloquent model
PolymorphicSettings::for($team)->put('theme', 'dark'); PolymorphicSettings::for($team)->get('theme'); // 'dark' // Same key, different scopes — fully isolated PolymorphicSettings::for($userA)->put('locale', 'en-US'); PolymorphicSettings::for($userB)->put('locale', 'fr-FR');
Via the HasSettings trait
Clean up calling sites by adding the trait to your models:
use SiteSource\PolymorphicSettings\Concerns\HasSettings; class Team extends Model { use HasSettings; } $team->settings()->put('theme', 'dark'); $team->settings()->get('theme'); // 'dark' // Eager load to avoid N+1 Team::with('scopedSettings')->get();
Opt-in cascade delete
Settings survive when their parent model is deleted by default. If you'd rather have them cleaned up:
class Team extends Model { use HasSettings; public bool $cascadeDeleteSettings = true; } $team->delete(); // settings for this team are purged
SoftDeletes is respected — soft deletes don't cascade (so restore() works), only forceDelete() triggers the cleanup.
Encryption
Per-key, opt-in via a named argument:
$user->settings()->put('api_key', 'sk-live-abc', encrypted: true); $user->settings()->get('api_key'); // 'sk-live-abc' (transparently decrypted)
Encryption is transparent — all(), getMany(), typed getters and dot-notation reads all see the plaintext. The raw DB value never contains the plaintext.
You can promote a plain setting to encrypted (and vice-versa) just by re-putting with a different encrypted: argument.
Bulk operations
$team->settings()->putMany([ 'theme' => 'dark', 'locale' => 'en-US', 'timezone' => 'UTC', ]); $team->settings()->getMany(['theme', 'locale', 'missing']); // ['theme' => 'dark', 'locale' => 'en-US', 'missing' => null] $team->settings()->all(); // every setting in this scope $team->settings()->forgetAll(); // nuke every setting in this scope
Dot-notation reads
$team->settings()->put('theme', [ 'palette' => ['primary' => ['hex' => '#abc123']], ]); $team->settings()->get('theme.palette.primary.hex'); // '#abc123'
Dot-notation is a read-time convenience for walking into an array value. Keys are always stored literally — put('commerce.foo', true) and get('commerce.foo') round-trip against a row whose stored key is the string commerce.foo. get() only falls back to nested-path traversal when no literal match exists, so you can safely use dotted keys as namespaced flat identifiers.
has(), forget(), and pull() are always literal. has('theme.mode') asks "is there a row with that exact key", not "can I reach that nested path through the theme row".
Typed getters
No implicit coercion — if the stored value is the wrong type, the default is returned:
$team->settings()->string('theme', 'default'); $team->settings()->int('max_members', 25); $team->settings()->float('rate', 1.0); $team->settings()->bool('feature_x', false); $team->settings()->array('tags', []);
Miscellaneous
$team->settings()->has('theme'); // true $team->settings()->forget('theme'); // bool — whether it existed $team->settings()->pull('theme'); // get + forget atomically $team->settings()->updateValues('theme', [ // merge into an existing array 'accent' => '#f00', ]);
Configuration
config/polymorphic-settings.php (all values can also be set via env vars):
return [ 'table' => env('POLYMORPHIC_SETTINGS_TABLE', 'polymorphic_settings'), 'key_type' => env('POLYMORPHIC_SETTINGS_KEY_TYPE', 'int'), // 'int' | 'uuid' 'cache' => [ 'enabled' => env('POLYMORPHIC_SETTINGS_CACHE_ENABLED', true), 'store' => env('POLYMORPHIC_SETTINGS_CACHE_STORE'), // null = default 'ttl' => env('POLYMORPHIC_SETTINGS_CACHE_TTL'), // null = forever 'prefix' => env('POLYMORPHIC_SETTINGS_CACHE_PREFIX', 'polymorphic-settings'), ], ];
Caching
Reads are cached through Laravel's cache. put and forget invalidate automatically. Cache keys are scoped ({prefix}:{scope_key}:{setting_key}) so two different models can never collide.
Missing keys are intentionally not cached to sidestep cross-driver null-caching quirks. If you hammer get('nonexistent') in a hot path, either supply a default or populate the key.
UUID primary keys
The installer asks which PK type to use and auto-detects from your User model. If your app uses UUIDs:
POLYMORPHIC_SETTINGS_KEY_TYPE=uuid
The configurable_id column is always stored as a string, so int-keyed and UUID-keyed parent models can coexist in the same settings table regardless of this setting.
Using Settings as the facade alias
PolymorphicSettings is a mouthful. If you'd prefer Settings::for($team)->get(...):
// config/app.php 'aliases' => [ 'Settings' => SiteSource\PolymorphicSettings\Facades\PolymorphicSettings::class, ],
The default facade alias stays PolymorphicSettings to avoid collisions with any existing Settings class in your app.
Testing
composer test
The suite runs against SQLite, MySQL, and Postgres in CI (120 tests, ~194 assertions as of v0.1.0).
Changelog
See CHANGELOG.md.
Contributing
Please see CONTRIBUTING.md for details.
Security Vulnerabilities
Please review our security policy on how to report security vulnerabilities.
Credits
License
The MIT License (MIT). Please see License File for more information.
sitesource/laravel-polymorphic-settings 适用场景与选型建议
sitesource/laravel-polymorphic-settings 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 385 次下载、GitHub Stars 达 0, 最近一次更新时间为 2026 年 04 月 23 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「configuration」 「encryption」 「laravel」 「Settings」 「eloquent」 「multi-tenant」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 sitesource/laravel-polymorphic-settings 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 sitesource/laravel-polymorphic-settings 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 sitesource/laravel-polymorphic-settings 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Configuration component
A simple PHP class to encrypt a string and decrypt an encrypted string
A package for automatically encrypting and decrypting Eloquent attributes in Laravel 5.5+, based on configuration settings.
Encryption with AES-256 and HMAC-SHA256
Allows installation of Laravel where the PHP Mcrypt extension is not available. Provides encryption using OpenSSL, or by disabling encryption entierly.
High-level cryptographic primitives and security utilities for Maatify systems including password hashing, reversible encryption, HKDF key derivation, and key rotation.
统计信息
- 总下载量: 385
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 41
- 依赖项目数: 1
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2026-04-23