bogdankharchenko/typed-laravel-settings

强类型Laravel设置。

v1.0.0 2022-01-04 23:37 UTC

README

run-tests codecov

强类型Laravel设置

安装

composer require bogdankharchenko/typed-laravel-settings

模型设置

namespace App\Models\User;

use Illuminate\Database\Eloquent\Model;
use BogdanKharchenko\Settings\Models\HasSettings;

class User extends Model
{
    use HasSettings;    
}

创建设置类

此类表示给定模型的一组可用设置。公共属性及其值将自动序列化为json列,并作为默认值。

use BogdanKharchenko\Settings\BaseSettings;

class UserSettings extends BaseSettings
{
    public string $favoriteColor = 'red';
}

设置设置

更改值将持久化到数据库中。在更新设置时,缓存将自动刷新。

$user = User::first();

$user->setSettings(function(UserSettings $settings){
    $settings->favoriteColor = 'blue';
});

// Updating Multiple Settings

$user->setSettings(function(UserSettings $settings, EmailPreferences $emailPreferences){
    $settings->favoriteColor = 'blue';

    $emailPreferences->marketing = false;
});

// Using the `setSettings()` Closure is a wrapper around the code example below.
$settings = new UserSettings($user);

$settings->favoriteColor = 'pink';

$settings->saveSettings();

获取设置

在您的应用程序中创建一个辅助函数,以便我们可以访问强类型设置。当从数据库中检索设置时,它将覆盖类上的默认设置。

class User extends Model 
{
    public function config(): UserSettings
    {
        return new UserSettings($this);      
    }
}

$user->config()->favoriteColor // returns blue

// Alternatively you can use docblocks to assist in typing

/** @var UserSettings $settings */
$settings = $user->getSettings(UserSettings::class);

$settings->favoriteColor // returns blue

设置值加密

您可以选择加密/解密敏感设置,如机密。您应该指定一个 protected array $encrypted 来列出要加密/解密的属性。数据将被加密到数据库中,并在检索时解密。

use BogdanKharchenko\Settings\BaseSettings;

class UserSettings extends BaseSettings
{
    protected array $encrypted = [
        'secret',
        'list',
    ];

    public ?string $secret = null;

    public array $list = [
        'a',
        'b',
        'c',
    ];
}

默认加密器是 BogdanKharchenko\Settings\Repository\Encrypter,但您可以选择通过实现 BogdanKharchenko\Settings\Contracts\EncrypterInterface 并更改配置来实现自己的加密策略。

验证

您可以在自定义 Settings 类中定义验证规则,就像在 FormRequests 中使用 rules()messages() 方法一样。这些规则将在尝试将数据持久化到数据库之前立即触发。

class SimpleSettingWithRule extends BaseSettings
{
    public string $favoriteColor = 'red';

    // Optional
    public function rules()
    {
        return [
            'favoriteColor' => ['required', Rule::in(['red', 'green'])],
            
            // Or
            $this->toName()->favoriteColor => ['required', Rule::in(['red', 'green'])],
        ];
    }

    // Optional 
    public function messages()
    {
        return [
            'favoriteColor.in' => 'color does not match',
        ];
    }
}

验证是可选的,因为您可以选择在其他应用程序部分中执行此操作。您还可以通过实现 BogdanKharchenko\Settings\Contracts\ValidatorInterface 并更改 validator 配置来自定义验证器。

形态映射 & 缓存

与Eloquent的形态映射类似,允许您的设置在不需要接触数据库的情况下进行结构重组是一个好主意。

// config/typed-settings.php

return [
    'morph'=>[
        'user-settings'=> UserSettings::class,
    ],
    'cache' => [
        'enabled' => true,
        'store' => 'redis',
        'seconds' => 600,
    ],
    
   'encrypter' => \BogdanKharchenko\Settings\Repository\Encrypter::class,
   'validator' => \BogdanKharchenko\Settings\Repository\Validator::class,
];

作用域

有时您可能需要在数据库级别检查设置,这里有一个可用的辅助作用域。

$users = User::query()
    ->whereSettings(UserSettings::class, 'favoriteColor', 'blue')
    ->get();