bogdankharchenko / typed-laravel-settings
强类型Laravel设置。
v1.0.0
2022-01-04 23:37 UTC
Requires
- php: ^7.4|^8.0
- illuminate/database: ^8.73
- illuminate/support: 8.*
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.4
- orchestra/testbench: ^6.23
- phpunit/phpunit: ^9.5
This package is auto-updated.
Last update: 2024-09-09 09:51:22 UTC
README
强类型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();