humans / settings
PHP 的基于类的设置处理器。
Requires
- illuminate/support: ^7.0.0|^8.0.0
Requires (Dev)
- phpunit/phpunit: ^8.3
- symfony/var-dumper: ^4.3
README
这是一个用于处理设置对象的属性包。它还提供了与 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
目前只有两个属性可用: boolean
和 json
。
但是不要担心! 您可以通过添加更多的转换实现来帮助我们,或者甚至从设置类中创建自己的转换!(代码是相同的)
添加自定义转换
要添加自定义转换,在您的自定义设置类(或甚至所有设置类的父类)中,创建一个以 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, ]);