rudnev/laravel-settings

Laravel框架的持久化设置

2.4.0 2024-03-14 15:53 UTC

This package is auto-updated.

Last update: 2024-09-14 17:06:02 UTC


README

Build Status StyleCI License: MIT Laravel Octane Compatible

Laravel框架的持久化设置

  • 易于使用
  • 应用程序设置 + 用户设置(作用域)
  • 事件
  • 缓存
  • 可扩展的设置管理器
  • Laravel Octane 兼容

要求

  • PHP 7.1 或更高版本
  • Laravel 5.5 或更高版本

基本用法

使用全局 settings 函数检索和存储数据

// app settings:

settings()->set('timezone', 'UTC');
settings()->get('timezone');

// the same:

settings(['timezone' => 'UTC']);
settings('timezone');

// user settings:

settings()->scope($user)->set('lang', 'en');
settings()->scope($user)->get('lang');

您也可以使用 Settings 门面

Settings::set('timezone', 'UTC');
Settings::get('timezone');

如果您喜欢使用合约,则可以使用方法依赖注入

<?php

namespace App\Http\Controllers;

use Rudnev\Settings\Contracts\RepositoryContract as Settings;

class MyController extends Controller
{
    public function index(Settings $settings)
    {
        $tz = $settings->get('timezone');
    }
}

入门指南

安装
API
作用域
翻译
缓存
事件
自定义存储

安装

您可以通过 composer 安装此包

composer require rudnev/laravel-settings

发布 配置 文件和 迁移

php artisan vendor:publish --provider="Rudnev\Settings\ServiceProvider"

在迁移发布后,您可以通过运行迁移来创建设置表

php artisan migrate

API

检查值

确定设置存储中是否存在项。

Settings::has('foo');

获取值

通过键从设置存储中检索项。

Settings::get('foo');

// You can specify a default value when an property is null or not found:

Settings::get('foo', 'default'); 

获取多个值

通过键从设置存储中检索多个项。设置存储中未找到的项将具有 null 值。

Settings::get(['foo', 'bar', 'baz']);

// with default value:

Settings::get(['foo', 'bar', 'baz' => 'default']);

获取所有值

获取所有设置项。

Settings::all();

设置值

在设置存储中存储项。

Settings::set('foo', 'bar');

设置多个值

在设置存储中存储多个项。

Settings::set([
    'foo' => 'bar', 
    'qux' => 'baz'
]);

移除值

从设置存储中移除项。

Settings::forget('foo');

移除多个值

从设置存储中移除多个项。

Settings::forget(['foo', 'bar']);

移除所有值

从设置存储中移除所有项。

Settings::flush();

点符号

您可以使用点符号来表示项的深度

Settings::set('products.desk', ['price' => 300, 'height' => 100]);
Settings::forget('products.desk.price');
Settings::has('products.desk.height');
Settings::get('products.desk');

作用域

如果您想为您的模型设置设置,可以使用 scope 方法

$user = auth()->user();

Settings::scope($user)->set('lang', 'en');

Settings::scope($user)->get('lang');

但最好使用 Rudnev\Settings\Traits\HasSettings 特性,例如

use Rudnev\Settings\Traits\HasSettings;
use Illuminate\Database\Eloquent\Model;

class User extends Model 
{
    use HasSettings;
    
    // ...
}

现在您可以使用 settings 属性来设置和获取值

$user = new User();
$user->settings = ['lang' => 'en'];
$user->save();

echo $user->settings['lang'];

$user->settings['timezone'] = 'UTC';
$user->save();

此外,settings 方法提供了对设置存储的直接访问(但不会更新模型状态)

$user->settings()->set('lang', 'en');
$user->settings()->get('lang');

// the same:

$user->settings(['lang' => 'en']);
$user->settings('lang');

要设置默认设置,请将 $settingsConfig 属性定义为包含 default 键的数组

use Rudnev\Settings\Traits\HasSettings;
use Illuminate\Database\Eloquent\Model;

class User extends Model 
{
    use HasSettings;
    
    protected $settingsConfig = [
        'default' => [
            'timezone' => 'UTC'
        ]
    ];
    
    // ...
}

如果您想指定来自 config/settings.php 的存储,请使用 store 选项

protected $settingsConfig = [
    'store' => 'database',
	
    'default' => [
        'timezone' => 'UTC'
    ]
];

除了为模型设置作用域外,您还可以自由创建应用程序设置的作用域,例如

// Set
Settings::scope('my-landing-page')->set('tracking_id', 'UA-000000-2');

// Get
Settings::scope('my-landing-page')->get('tracking_id');

翻译

建议使用内置的 laravel 方法来翻译任何键、名称和描述。您可以使用这种方法为大多数 laravel 包进行操作,当您可以在一个地方完成这项工作时,无需在多个数据库表中存储翻译。

例如,创建一个文件 resources/lang/en/settings.php

<?php

return [
    'user' => [
        'language' => [
            'name' => 'Language',
            'description' => 'The site language.'    
        ],
        
        'mfa' => [
            'name' => 'MFA',
            'description' => 'Multi-factor authentication.'    
        ],
    ]
];

并获取翻译后的字符串

$user = auth()->user();
$userSettings = Settings::scope($user);

// Store locale:
$userSettings->set('language', 'en');

// Store some settings:
$userSettings->set('mfa', 'enabled');

// Retrieve locale:
$locale = $userSettings->get('language');

// Apply locale:
App::setLocale($locale);

// Print translated strings:
foreach ($userSettings->all() as $key => $value)
{
    $name = trans("settings.user.$key.name");
    $desc = trans("settings.user.$key.description");
    
    echo "$name: $value ($desc)" . PHP_EOL;
}

缓存

默认启用缓存,您可以在 config/settings.php 文件中更改此设置。

要清除缓存,您可以运行以下 Artisan 命令

php artisan settings:clear-cache

注意:此命令实际上不会删除缓存条目,它仅通过更改键的前缀来使它们无效。如果您使用设置来处理模型,缓存可能会快速增长。因此,建议使用支持驱逐策略的驱动程序,如 redis,或使用命令 php artisan cache:clear 完全清除缓存。

事件

如果没有通过配置禁用(默认启用),将触发事件。

自定义存储

要创建自己的商店,您必须在 SettingsManager 上使用 extend 方法,该方法用于将自定义驱动解析器绑定到管理器,但首先您需要实现 StoreContract

use Rudnev\Settings\Contracts\StoreContract;

class MongoStore implements StoreContract {
// ...
}

之后,要注册一个名为 "mongo" 的新设置驱动,您需要做以下操作

Settings::extend('mongo', function($app, $storeName, $config)
{
    return Settings::repository(new MongoStore);
});

传递给 extend 方法的第一个参数是驱动名称。这将在 config/settings.php 配置文件中的驱动选项中对应。第二个参数是一个闭包,它应该返回一个 Rudnev\Settings\Repository 实例。闭包将传递一个 $app 实例,这是一个 Illuminate\Foundation\Application 实例,也是一个服务容器。

可以在随 Laravel 应用程序一起提供的默认 App\Providers\AppServiceProviderboot 方法中调用 Settings::extend,或者您也可以创建自己的服务提供者来容纳扩展。

最后,您可以通过以下方式访问您的商店

Settings::store('mongo')->get('foo');

致谢

许可证

MIT 许可证 (MIT)。请参阅 许可证文件 获取更多信息。