leeovery/laravel-settings

Laravel Settings - 基于文件默认值和数据库自定义值的用户设置处理包。

v2.0 2022-02-18 16:41 UTC

This package is auto-updated.

Last update: 2024-09-18 22:20:48 UTC


README

Latest Version on Packagist Build Status Quality Score Total Downloads

此包允许您创建一个或多个设置文件,这些文件存储默认设置,同时还提供一个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生成的。