humans/settings

PHP 的基于类的设置处理器。

3.1.1 2020-10-25 09:43 UTC

This package is auto-updated.

Last update: 2024-09-25 18:59:49 UTC


README

Latest Stable Version License

这是一个用于处理设置对象的属性包。它还提供了与 Laravel 数据库模型的默认集成。

安装

您可以通过 composer 安装此包

composer require humans/settings

用法

设置包是一个类,您可以在此类中存储设置,如果没有设置显式值,则可以具有回退值。(即持久性)

use Humans\Settings\Setings;

class UserSettings extends Settings
{
    protected $defaults = [
        'notifications' => [
            'sms' => true,
            'email' => true,
        ],
    ];
}

从设置包中获取值有两种不同的方式。

get($settings, $default = null)

(new UserSettings)->get('notifications'); 
// => ['sms' => true, 'email' => true]

(new UserSettings)->get('notifications.sms');
// => true

(new UserSettings)->get('notifications.push', false);
// => false

另一种是链式公共属性。

(new UserSettings)->notifications;
// => ['sms' => true, 'email' => true]

(new UserSettings)->notifications->sms;
// => true

要获取设置包中的所有值。

(new UserSettings)->all();

覆盖默认值

现在我们可以设置值,我们希望将持久化数据应用到我们的默认设置中。

$userSettingsFromDatabase = [
    'notifications' => [
        'sms' => false,
	  ]
];

$settings = new UserSettings($userSettingsFromDatabase);

$settings->all();
# => [
#        'notifications' => [
#            'sms'   => false, <-- using the values from the database,
#            'email' => true,
#        ],
#    ]

有时,将数组值存储在数据库中很麻烦

  • 数据库可能不支持。
  • 我们不希望通过关系键值方式创建过于复杂的数据库。

您可以通过 点符号 存储嵌套的设置值,此包将值解构为嵌套数组。

$userSettingsFromDatabase = [
    'notifications.sms' => false,
];

$settings = new UserSettings($userSettingsFromDatabase);

$settings->all();
# => [
#        'notifications' => [
#            'sms'   => false, <-- assigned via dot notation.
#            'email' => true,
#        ],
#    ]

类型转换

有时我们从数据库中提取的值无法映射到我们想要的数据类型。为此,我们有一个 $casts 属性来处理所有原始值的映射。

class UserSettings extends Settings
{
    protected $defaults = [
        'notifications' => [
            'sms'   => 1,
            'email' => 1,
        ],
    ];
  
    protected $casts = [
        'notifications.sms'   => 'boolean',
        'notifications.email' => 'boolean',
    ];
}

(new UserSettings)->get('notifications.sms');
# => true

(new UserSettings)->get('notifications.email');
# => true

目前只有两个属性可用: booleanjson

但是不要担心! 您可以通过添加更多的转换实现来帮助我们,或者甚至从设置类中创建自己的转换!(代码是相同的)

添加自定义转换

要添加自定义转换,在您的自定义设置类(或甚至所有设置类的父类)中,创建一个以 as 为前缀的方法。

class UserSettings extends Settings
{
    protected $defaults = [
        'age'            => '27',
        'hours_of_sleep' => '8',
    ];
  
    protected $casts = [
        'age' => 'integer',
    ];
  
    protected function asInteger($age)
    {
        return (int) $age;
    }
}

(new UserSettings)->get('age');
# => 27

(new UserSettings)->get('hours_of_sleep');
# => '8'

Laravel 集成

默认情况下,我们试图将 Laravel 项目的设置简化到最小。通过 composer 安装后,公开配置文件和迁移。

php artisan vendor:publish --provider="Humans\Settings\Laravel\ServiceProvider"

运行我们的新设置表迁移。

php artisan migrate

创建设置文件

php artisan settings:make UserSettings

最后,将我们的设置特质添加到模型中。特质将自动在配置命名空间中查找设置文件,并附加 Settings. 字符。

因此,如果我们有一个 User.php,默认情况下它将查找 App\Settings\UserSettings 类。

use Humans\Settings\Laravel\HasSettings;

class User extends Model
{
    use HasSettings;
}

class Workspace extends Model
{
    use HasSettings;
}

要更改类位置,您可以在模型中更改 getSettingsClass 方法。

use Humans\Settings\Laravel\HasSettings;

class User extends Model
{
    use HasSettings;

    protected function getSettingsClass()
    {
        return \App\Models\Settings\AccountSettings::class;
    }
}

use Humans\Settings\Laravel\HasSettings;

class Workspace extends Model
{
    use HasSettings;

    public function getSettingsClass()
    {
        return \App\Models\Settings\AccountSettings::class;
    }
}

有了这个,您现在可以通过 settings 公共属性访问您的值。

User::first()->settings->notifications->sms
# => true

保存到数据库

要保存单个值到数据库。

User::first()->settings->set('notifications.sms', false);

要同时保存多个值

User::first()->settings->update([
    'notifications' => [
        'sms'   => false,
        'email' => false,
    ],
]);

# or using dot notation
User::first()->settings->update([
    'notifications.sns'   => false,
    'notifications.email' => false,
]);