xgrz/laravel-app-settings

laravel中应用设置的简单处理

1.0.5 2024-02-23 11:27 UTC

This package is auto-updated.

Last update: 2024-09-23 12:42:58 UTC


README

用于处理应用设置的简单易用且性能高的laravel模块。每次应用重新加载时优化1次缓存/数据库。

该包处理配置文件中的默认设置,因此您可以简单地复制配置文件到第二个项目,其中已设置所有设置。

1. 安装

使用composer安装包

composer require xgrz/laravel-app-settings

发布配置

php artisan app-settings:publish

发布后,您将在应用/config目录中找到2个配置文件。

  • laravel-app-settings-config包含包配置
  • laravel-app-settings-definitions包含设置定义

设置数据库表名(在下一步之前)

请随意更新/config/laravel-app-settings-config.php中的database_table -> database_table,以防与您的数据库模式冲突。默认表名设置为settings

运行迁移

php artisan migrate

配置和同步设置

使用终端运行同步命令,编辑您的/config/laravel-app-settings-definitions文件以设置自己的设置。在所有更改完成后,您必须运行同步命令。

php artisan app-settings:sync 

2. 在代码中使用设置

在此示例中,假设设置键application.key已存在。

获取设置值的首选方式是使用全局辅助函数

setting('application.name');

函数setting($param);仅接受设置键作为参数。

获取值的第二种方式是使用设置外观

use xGrz\LaravelAppSettings\Support\Facades\Settings;

Settings::get('application.name`);

此外观方法仅接受设置键作为参数。

缺失键的行为

如果键不存在

xGrz\LaravelAppSettings\Exceptions\SettingsKeyNotFoundException

将被抛出。

3. 修改设置

如果只想修改设置值,最简单的方法是使用外观

use xGrz\LaravelAppSettings\Support\Facades\Settings;

Settings::set('application.name`, 'SOME NEW VALUE');

在管理设置的情况下,您可能还想更改描述。

use xGrz\LaravelAppSettings\Support\Facades\Settings;

Settings::update('application.name`, [
    'value' => 'SOME NEW VALUE',
    'description' => 'New setting key description'
]);

默认情况下,您可以使用我们的FormRequest在控制器中验证传入的更新数据。验证规则是动态的,取决于设置类型。

在控制器中更新方法

use Illuminate\Http\Response;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use xGrz\LaravelAppSettings\Http\Requests\UpdateSettingRequest;
use xGrz\LaravelAppSettings\Exceptions\SettingsKeyNotFoundException;
use xGrz\LaravelAppSettings\Exceptions\SettingValueValidationException;
use xGrz\LaravelAppSettings\Models\Setting;

public function update(UpdateSettingRequest $request, Setting $setting)
    {
        try {
            $updated = Settings::update($setting, $request->validated());
        } catch (SettingsKeyNotFoundException $e) {
            throw new ModelNotFoundException($e->getMessage());
        } catch (SettingValueValidationException $e) {
            abort(Response::HTTP_NOT_ACCEPTABLE, $e->getMessage());
        }
        return ...
    }

4. 添加/删除新设置

4.1 添加设置

转到/config/laravel-app-settings-definitions.php。在此配置文件中,您将看到定义的组及其设置的树。您被允许添加新的组和键名。您可以在任何时间从定义文件中删除键名/组。

在定义文件中进行更改后,您必须始终使用Artisan命令进行同步

php artisan app-settings:sync

定义新的设置组 打开定义文件并添加新的数组项,例如,假设我们想要添加一个名为seo的新组

return [
    // some existsing settings
    'seo' => [
        // key-names for seo group.
    ]
]

seo组为空,因此让我们添加一些键

return [
    // some existsing settings
    'seo' => [
        'google_gtm' => [
            // definition of seo.google_gtm key
        ],
        'adwords_id' => [
            // definition of seo.adwords_id
        ]
    ]
]

每个键都应该使用valuedescriptiontype进行定义。

type属性期望提供SettingValueType(枚举xGrz\LaravelAppSettings\Enums\SettingValueType)。您可以从以下选项中选择

  • SettingValueType::Text(字符串),
  • SettingValueType::Number(整数,浮点数),
  • SettingValueType::Selectable(数组),
  • SettingValueType::BooleanType(布尔值),

value属性是键的初始值,并且对于定义的设置值类型必须是有效的。

description可选属性。在您使用用户界面管理设置时很有用。

您的配置应如下所示

return [
    // some existsing settings
    'seo' => [
        'google_gtm' => [
            'value' => '',
            'type' => SettingValueType::Text,
            'description' => 'Google Tag Manager'
        ],
        'adwords_id' => [
            'value' => 123093093,
            'type' => SettingValueType::Number,
            'description' => 'Google adwords id'
        ]
    ]
]

记住在编辑定义文件后同步设置

php artisan app-settings:sync

4.2. 删除设置

从定义文件中删除键名或整个组,然后运行同步

php artisan app-settings:sync

5. 数据库刷新(seeder)后的设置同步。

每次刷新数据库时,您都必须运行同步命令(php artisan app-settings:sync)以恢复初始设置。通常情况下,您希望在清空数据库后应用程序能够立即使用,因此可以通过添加 Seeder 来自动化此过程。

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use xGrz\LaravelAppSettings\Database\Seeders\LaravelAppSettingsSeeder;

class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        $this->call(LaravelAppSettingsSeeder::class);
        // ... [other seeders]
    }
}