zachleigh/laravel-property-bag

使用属性包轻松管理 Laravel 用户设置

v1.4.1 2020-01-05 06:29 UTC

README

Latest Stable Version License Build Status Quality Score StyleCI Total Downloads

Laravel 应用程序的简单设置。
  • 轻松为多个资源提供设置
  • 随着应用程序的增长,简单添加额外的设置
  • 设置默认设置并限制设置值以增强安全性
  • 完全可配置

内容

升级信息

从 1.3.* 到 1.4.0

1.4.0 删除了对 PHP 7.1 的支持,并添加了对 Laravel 6 的支持。

从 1.2.* 到 1.3.0

1.3.0 删除了对 PHP 7.0 的支持。

从 1.1.* 到 1.2.0

1.2.0 删除了对 PHP 5.6 的支持。它可能仍然可以在较老的 PHP 版本中运行,但针对 5.6 或更低版本的具体错误或问题将不再处理。添加了对 PHP 7.2 的支持。

从 1.0.* 到 1.1.0

1.1.0 添加了对 Lumen 的支持以及对 Laravel 5.4 的支持(感谢 tzurbaev)。不应该有任何破坏性更改。如果使用 Laravel 5.3,请使用 版本 1.0.5

composer require zachleigh/laravel-property-bag:1.0.*
从 0.9.* 到 1.0.0

版本 1.0.0 对该包进行了重大更改,使其与先前版本不兼容。该包基本上被重写,从 0.9.7 升级到 1.0.0 至少是困难的。

关于

Laravel Property Bag 通过使用单个数据库属性包表,为您的应用程序资源提供可保存、安全设置。与在资源表上使用 json 块列相比,使用此类设置表的优点是,如果将来您决定更改设置值,简单的数据库查询可以轻松处理。

安装

1. 通过 composer 安装
composer require zachleigh/laravel-property-bag

Laravel 安装

a. 注册服务提供者

在 Laravel 的 config/app.php 文件中,将服务提供者添加到具有 'providers' 键的数组中。

LaravelPropertyBag\ServiceProvider::class
b. 发布迁移
php artisan vendor:publish --provider="LaravelPropertyBag\ServiceProvider"

Lumen 安装

a. 启用 Eloquent

如果您还没有这样做,在 app/boostrap.php 中找到并取消注释 $app->withEloquent()

b. 注册服务提供者

在 Lumen 的 app/bootstrap.php 文件中,添加服务提供者。

$app->register(LaravelPropertyBag\ServiceProvider::class);
c. 复制迁移文件

由于 Lumen 不提供 php artisan vendor:publish 命令,您必须手动将迁移文件从 vendor/zachleigh/laravel-property-bag/src/Migrations 目录复制到 database/migrations 目录。

2. 运行迁移
php artisan migrate
3. 为您的资源创建一个新的设置配置文件。
php artisan pbag:make {resource}

{resource} 应该是您想要添加设置的模型名称。例如

php artisan pbag:make User

这将创建一个 Settings 目录,其中包含一个 UserSettings 类,您可以在其中配置 User 类的设置。

使用方法

1. 在模型中使用特性。
...
use LaravelPropertyBag\Settings\HasSettings;

class User extends Model
{
    use HasSettings;

    ...
}
2. 注册您的设置及其允许的值和默认值

在发布 UserSettings 文件(希望您已经在上文中这样做)后,在 UserSettings 类中注册设置。

protected $registeredSettings = [
    'example_setting' => [
        'allowed' => [true, false],
        'default' => false
    ]
];

每个设置必须包含一个允许值数组和默认值。还可以使用 验证规则 而不是硬编码允许值。

3. 从用户模型设置设置
$user->settings(['example_setting' => false]);
// or
$user->settings()->set(['example_setting' => false]);
// or
$user->setSettings(['example_setting' => false]);

一次设置多个值

$user->settings([
    'example_setting' => false,
    'another_setting' => 'grey'
]);
4. 从用户模型获取设置的值
$value = $user->settings('example_setting');
// or
$value = $user->settings()->get('example_setting');

如果值未设置,将返回注册的默认值。 请注意,默认值不会存储在数据库中,以限制数据库大小。

方法

get($key)

获取指定键的值。

$value = $model->settings()->get($key);
set($array)

将数组键设置为相关联的值。值可以是任何类型。返回设置。 当将默认值传递给set()时,它将不会存储在数据库中。 如果您的默认值未显示在表中,请不要惊慌。如果值未在允许的值数组中注册,将抛出LaravelPropertyBag\Exceptions\InvalidSettingsValue异常。您可以使用$e->getFailedKey()方法检索失败的设置名称。

$model->settings()->set([
  'key1' => 'value1',
  'key2' => 'value2'
]);

// or

$model->setSettings([
  'key1' => 'value1',
  'key2' => 'value2'
]);
getDefault($key)

获取指定键的默认值。

$default = $model->settings()->getDefault($key);

// or

$default = $model->defaultSetting($key);
allDefaults()

获取注册设置的默认值。返回集合。

$defaults = $model->settings()->allDefaults();

// or

$defaults = $model->defaultSetting();
getAllowed($key)

获取指定键的允许值。返回集合。

$allowed = $model->settings()->getAllowed($key);

// or

$allowed = $model->allowedSetting($key);
allAllowed()

获取注册设置的允许值。返回集合。

$allowed = $model->settings()->allAllowed();

// or

$allowed = $model->allowedSetting();
isDefault($key, $value)

如果给定值是给定键的默认值,则返回true。

$boolean = $model->settings()->isDefault($key, $value);
isValid($key, $value)

如果给定值是给定键的允许值,则返回true。

$boolean = $model->settings()->isValid($key, $value);
all()

返回模型的所有设置值。返回集合。

$allSettings = $model->settings()->all();

// or

$allSettings = $model->allSettings();
keyIs($key, $value)

如果给定键的设置等于给定值,则返回true。

$boolean = $model->settings()->keyIs($key, $value);
reset($key)

将键重置为默认值。

$default = $model->settings()->reset($key);
withSetting($key, $value = null)

获取一个数组,其中包含所有具有给定设置和/或值的存储行。

$collection = $model::withSetting($key);
// or
$collection = $model::withSetting($key, $value);

验证规则

除了在数组中硬编码值外,还可以定义规则来确定设置值是否有效。规则始终是字符串,必须包含字符串的开始和结束处的冒号。

'integer' => [
    'allowed' => ':int:',
    'default' => 7
]

在这种情况下,为'int'键保存的设置值必须是一个整数。

某些规则需要参数。可以通过使用等号和逗号分隔的列表在规则定义中传递参数。

'range' => [
    'allowed' => ':range=1,5:',
    'default' => 1
]

可用规则

':any:'

任何值都将被接受。

':alpha:'

字母值将被接受。

':alphanum:'

字母数字值将被接受。

':bool:'

布尔值将被接受。

':int:'

整数值将被接受。

':num:'

数值将被接受。

':range=low,high:'

介于或包含给定低和高参数之间的数值将被接受。例如

'range' => [
    'allowed' => ':range=1,10:',
    'default' => 5
]

允许的数字为1到10。

':string:'

字符串将被接受。

用户定义的规则

要创建用户定义的规则,首先发布Rules文件到Settings/Resources/Rules.php

php artisan pbag:rules

规则验证方法应该通过在规则名称前添加'rule'来命名。例如,如果我们的规则是'example',我们将在设置配置文件中这样定义它

'setting_name' => [
    'allowed' => ':example:',
    'default' => 'default'
]

然后我们的方法将被称为'ruleExample'

public static function ruleExample($value)
{
    // do stuff
    //
    // return boolean;
}

所有规则方法都应该是静态的,因此它们不应该关心对象或应用程序状态。如果您的规则需要参数,将它们作为方法的参数接受。

'setting_name' => [
    'allowed' => ':example=arg1,arg2:',
    'default' => 'default'
]
public static function ruleExample($value, $arg1, $arg2)
{
    // do stuff
    //
    // return boolean;
}

另一种选择是使用Laravel内置的验证来验证输入,这比这个包提供的更完整,然后将所有设置允许的值设置为':any:'。

高级配置

Laravel Property Bag提供了几种方法来配置包以适应您的需求和愿望。

我不想将设置注册为数组

好的。我明白了。特别是如果您有数十个设置,处理数组可能会很麻烦。在模型设置配置文件中添加registeredSettings方法。

/**
 * Return a collection of registered settings.
 *
 * @return Collection
 */
public function registeredSettings()
{
    // Your code

    return $collection;
}

在这个方法中,做您想做的,并返回一个与registeredSettings数组具有相同结构的项的集合。

'example_setting' => [
    'allowed' => [true, false],
    'default' => true
]
我想使用动态的允许和默认值。

没问题。就像上面的部分一样,在设置配置文件中创建自己的registeredSettings方法并返回一个注册设置的集合。

/**
 * Return a collection of registered settings.
 *
 * @return Collection
 */
public function registeredSettings()
{
    $allGroups = Auth::user()->allGroupNames();

    return collect([
        'default_group' => [
            'allowed' => $allGroups,
            'default' => $allGroups[0]
        ]
    ]);
}

allGroupNames函数简单返回一个组名数组

/**
 * Get array of all group names.
 *
 * @return array
 */
public function allgroupNames()
{
    return $this->groups->pluck('name')->all();
}

您还可以使用getResource()方法访问设置所附加的模型。

/**
 * Return a collection of registered settings.
 *
 * @return Collection
 */
public function registeredSettings()
{
    $allGroups = getResource()->allGroupNames();

    return collect([
        'default_group' => [
            'allowed' => $allGroups,
            'default' => $allGroups[0]
        ]
    ]);
}

贡献

欢迎贡献。Fork,改进并提交Pull Request。对于错误、改进想法或其他,请创建一个问题