zachleigh / laravel-property-bag
使用属性包轻松管理 Laravel 用户设置
Requires
- php: >=7.1
Requires (Dev)
- laravel/browser-kit-testing: ~1.0
- laravel/laravel: ^6.0
- phpunit/phpunit: ~4.0
This package is auto-updated.
Last update: 2024-09-05 16:59:16 UTC
README
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。对于错误、改进想法或其他,请创建一个问题。