rudnev / laravel-settings
Laravel框架的持久化设置
Requires
- php: ^7.1|^8.0
- ext-json: *
- illuminate/contracts: ^5.5|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0
- illuminate/database: ^5.5|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0
- illuminate/events: ^5.5|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0
- illuminate/support: ^5.5|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0
Requires (Dev)
- mockery/mockery: ^1.3
- orchestra/testbench: ^3.6|^4.0|^5.0|^6.0|^7.0|^8.0|^9.0
- phpunit/phpunit: ^7.0|^8.0|^9.0|^10.0
README
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'); } }
入门指南
安装
您可以通过 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\AppServiceProvider 的 boot 方法中调用 Settings::extend,或者您也可以创建自己的服务提供者来容纳扩展。
最后,您可以通过以下方式访问您的商店
Settings::store('mongo')->get('foo');
致谢
许可证
MIT 许可证 (MIT)。请参阅 许可证文件 获取更多信息。