leeovery / laravel-settings
Laravel Settings - 基于文件默认值和数据库自定义值的用户设置处理包。
Requires
- php: ^8.0|^8.1
- ext-json: *
- illuminate/config: ^8.0|^9.0
- illuminate/database: ^8.0|^9.0
- illuminate/support: ^8.0|^9.0
- myclabs/deep-copy: ^1.9
- spatie/laravel-package-tools: ^1.4.3
Requires (Dev)
- orchestra/testbench: ^7.0
- phpunit/phpunit: ^9.5.10
This package is auto-updated.
Last update: 2024-09-18 22:20:48 UTC
README
此包允许您创建一个或多个设置文件,这些文件存储默认设置,同时还提供一个API来编辑设置,并将这些编辑存储在数据库中。当获取设置时,自定义值将合并到默认值中。
主要用于基于用户的设置,但也可以用于多种其他原因。
以下是一个快速示例...
安装
您可以通过Composer安装此包
composer require leeovery/laravel-settings
php artisan vendor:publish --provider="Leeovery\LaravelSettings\LaravelSettingsServiceProvider" --tag="config"
使用方法
给定一个名为 /config/settings-user-notifications.php
的设置文件,其内容如下...
return [ 'orders' => [ 'general' => [ 'email' => true, 'alerts' => true, ], 'status_change' => [ 'email' => true, 'alerts' => true, ], ], ... ];
您可以通过以下方式获取设置
$userId = 100; settings('user-notifications', $userId)->get(); // will return... 'orders' => [ 'general' => [ 'email' => true, 'alerts' => true, ], 'status_change' => [ 'email' => true, 'alerts' => true, ], ], ...
如您所见,这将返回ID为100的用户的上述所有设置。
请注意,这些设置与默认设置没有区别,因为此时用户尚未进行任何更改。
现在让我们来改变这一点...
settings('user-notifications', $userId)->set(['orders.general.email' => false]);
上面的行调用set()并传递键和值。该值将持久化存储在数据库中,以便我们可以这样做...
settings('user-notifications', $userId)->get(); // will return... 'orders' => [ 'general' => [ 'email' => false, // NOTE this is different! 'alerts' => true, ], 'status_change' => [ 'email' => true, 'alerts' => true, ], ], ...
返回的数据现在等于所有默认值,除了嵌套键 orders.general.email
,该值将等于上面对自定义更改的FALSE。
这就是最基本的用例...
但是,您可以做更多...
多个设置文件
您可以在config目录中设置多个设置文件,只需在文件名前加上 settings-
(或您在包配置文件中配置的任何内容)。
例如
/config/settings-user-privacy.php
/config/settings-social.php
/config/settings-user-account-access.php
现在您可以从这些文件中 get()
和 set()
设置
$settings = settings('user-privacy', $userId)->get(); $settings = settings('social', $userId)->get();
基于值对象的值
您可以在设置文件中使用对象作为值,如下所示
return [ 'orders' => [ 'general' => [ 'email' => SettingStore::make(true, 'You can set a label here'), // option one 'alerts' => LaravelSettings::setting(true, 'You can set a label here'), // option two ], ], ... ];
访问子集而不是所有设置
有时您只需要一组设置。您可以通过指定点表示法来这样做。请注意,包将完全键入结果,以便您可以使用这些键来设置。
例如
给定一个设置文件 /config/settings-email-notifications.php
return [ 'orders' => [ 'general' => [ 'email' => SettingStore::make(true), 'alerts' => SettingStore::make(true), ], 'digital' => [ 'status_change' => [ 'email' => SettingStore::make(true), 'alerts' => SettingStore::make(true), ], ], ], ... ];
您可以像这样存储用户编辑
settings('user-notifications', $userId)->set([ 'orders.digital.status_change.email' => false // just store primitive value here not VO ]);
并且...您可以像以下这样访问深层的 status_change
子集
settings('email-notifications', $userId)->get('orders.digital.status_change'); // will return... 'orders' => [ 'digital' => [ 'status_change' => [ 'email' => false, // note non-default value 'alerts' => true, ], ], ],
如您所见,我们完全键入结果,但只返回请求的子集。
待办事项
- 可以访问子集
- 缓存以减少数据库查询并优化
- 基于驱动程序的方法,允许用户更改默认系统和缓存层。
-
SettingStore
值验证
测试
composer test
更新日志
有关最近更改的更多信息,请参阅更新日志。
贡献
有关详细信息,请参阅贡献指南。
鸣谢
许可
MIT许可证(MIT)。有关更多信息,请参阅许可文件。
Laravel Package Boilerplate
此包是使用Laravel Package Boilerplate生成的。