artisan / settings
1.0.0
2019-10-04 03:12 UTC
Requires
- illuminate/support: ^5.7|^6.0
Requires (Dev)
- phpunit/phpunit: ^8.3
- symfony/var-dumper: ^4.3
README
此包可以帮助在Laravel应用中对模型应用设置。它使用属性包
模式,为您所有的模型设置创建一个单一的表。
class UserSettings extends Artisan\Settings\Settings { protected $defaults = [ 'notifications' => [ 'sms' => true, 'email' => true, ], ]; } User::first()->settings->get('notifications.sms'); // true User::first()->settings->get('notifications.push', false); // false User::first()->settings->notifications->email // true
安装
通过composer安装此包。
composer require artisan/laravel-settings
接下来,我们将发布配置。
php artisan vendor:publish --provider="Artisan\Settings\ServiceProvider"
迁移设置表。
php artisan migrate
使用方法
为您的模型创建一个设置文件。
php artisan make:settings UserSettings
将Artisan\Settings\HasSettings
特质添加到模型中。
use Artisan\Settings\HasSettings; class User extends Model { use HasSettings; } class Workspace extends Model { use HasSettings; }
默认情况下,这将猜测设置命名空间中的类名 + 设置。要自定义此,请在模型中重写getSettingsClass
class User extends Model { use HasSettings; public function getSettingsClass() { return \App\Models\Settings\AccountSettings::class; } } class Workspace extends Model { use HasSettings; public function getSettingsClass() { return \App\Models\Settings\AccountSettings::class; } }
get($key, $default = null)
当从数据库中获取设置时,请注意,如果设置不存在,该函数将返回null。
使用此方法,我们可以获取我们的设置。
$user->settings()->get('notification.sms');
或者在找不到时添加默认值!
$user->settings()->get('notification.sms', $default = true);
set($key, $value)
$user->settings->set('timezone', 'Asia/Manila');
all() 当获取所有结果时,如果您的模型存在设置类,它将合并所有默认值。见下文了解更多上下文。
$user->settings->all();
任何基于点表示法的设置都将作为数组返回。
// notification.sms => true // notification.email => false // timezone => Asia/Manila [ 'notification' => [ 'sms' => true, 'email' => false, ], 'timezone' => 'Asia/Manila', ]
默认值和转换
有时这些默认值可能有点太多难以跟踪,我们还想确保从数据库中获取时值处于正确的数据类型。
我们可以创建一个设置类来添加默认值和值转换。
<?php namespace App\Settings; class UserSettings { protected $defaults = [ 'notification' => [ 'sms' => true, 'email' => true, ], ]; protected $casts = [ 'notifications' => [ 'sms' => 'boolean', ] ]; }
对于自定义转换,以防万一,您可以添加一个新的方法来应用转换。
<?php namespace App\Settings; class UserSettings { protected $defaults = [ 'notifications' => [ 'sms' => false, 'email' => true, ], ]; protected $casts = [ 'notifications' => [ 'sms' => 'some_custom_cast', ] ]; protected function asSomeCustomCast($value) { return 'transformed value here'; } }