artisan/settings

此包已被弃用且不再维护。作者建议使用humans/settings包代替。

设置管理。

1.0.0 2019-10-04 03:12 UTC

This package is not auto-updated.

Last update: 2020-02-07 23:16:44 UTC


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';
    }
}