承接 gsebastiao/laravel-settings 相关项目开发

从需求分析到上线部署,全程专人跟进,保证项目质量与交付效率

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

gsebastiao/laravel-settings

Composer 安装命令:

composer require gsebastiao/laravel-settings

包简介

Pacote de settings para Laravel com chave composta, hierarquia de contexto (global → tenant → user) e cast dinâmico.

README 文档

README

Pacote Laravel para gestão de settings com chave composta, hierarquia de contexto (global → tenant → user) e cast dinâmico de valores.

PHP Laravel License

Instalação

composer require gsebastiao/laravel-settings

O pacote usa auto-discovery — o SettingsServiceProvider e o alias Settings são registados automaticamente.

Corre a migration:

php artisan migrate

Publicar recursos (opcional)

# Publicar tudo (config + migrations)
php artisan vendor:publish --tag=settings

# Só configuração
php artisan vendor:publish --tag=settings-config

# Só migrations (para personalizar)
php artisan vendor:publish --tag=settings-migrations

Configuração

Após publicar, edita config/settings.php:

return [
    'cache' => [
        'ttl'    => env('SETTINGS_CACHE_TTL', 300),      // segundos
        'prefix' => env('SETTINGS_CACHE_PREFIX', 'settings:'),
        'driver' => env('SETTINGS_CACHE_DRIVER', null),  // null = driver padrão
    ],
    'table'        => env('SETTINGS_TABLE', 'settings'),
    'default_cast' => 'string',
    'contexts' => [
        'default' => 'global',
        'user'    => 'user',    // → 'user:42'
        'tenant'  => 'tenant',  // → 'tenant:5'
    ],
];

Ou via .env:

SETTINGS_CACHE_TTL=600
SETTINGS_TABLE=app_settings
SETTINGS_CACHE_DRIVER=redis

Uso

Helper global settings()

// Ler (com default)
$name = settings('general.name', 'AHOL SOLUÇÕES');

// Ler com contexto do utilizador autenticado
$theme = settings('ui.theme', 'light', context: SettingsService::userContext());

// Shortcut idêntico
$theme = user_setting('ui.theme', 'light');

// Aceder ao serviço (para escrita, lock, etc.)
settings()->set('ui.theme', 'dark', context: 'user:42');

Facade Settings::

use Gsebastiao\LaravelSettings\Facades\Settings;
use Gsebastiao\LaravelSettings\Services\SettingsService;

// Leitura
Settings::get('ui.font_size', 14);
Settings::get('ui.language', 'pt', context: Settings::userContext());
Settings::all('ui', context: 'user:42');   // Collection ['theme' => 'dark', ...]
Settings::has('general.name');

// Escrita
Settings::set('general.name', 'Nova Empresa');
Settings::set('ui.theme', 'dark', context: 'user:42');
Settings::set('ui.language', 'pt', options: [
    'metadata' => ['input' => 'select', 'options' => ['pt', 'en', 'es', 'fr']],
]);

// Gestão
Settings::lock('general.version');         // bloqueia overrides por outros contextos
Settings::forget('ui.theme', context: 'user:42');
Settings::forgetContext('user:42');        // limpar ao apagar utilizador

Injecção de dependência

use Gsebastiao\LaravelSettings\Services\SettingsService;

class ProfileController extends Controller
{
    public function __construct(private SettingsService $settings) {}

    public function update(Request $request): RedirectResponse
    {
        $ctx = SettingsService::userContext(); // 'user:42'

        $this->settings->set('ui.language',  $request->language,  $ctx);
        $this->settings->set('ui.font_size', $request->font_size, $ctx, cast: 'int');
        $this->settings->set('ui.theme',     $request->theme,     $ctx);

        return back()->with('success', 'Preferências guardadas.');
    }
}

Hierarquia de contexto

settings('ui.language', 'pt', context: 'user:42')

  1. Existe 'ui.language' @ 'user:42'? ──→ SIM  → devolve 'en'
                                        └→ NÃO  → tenta 'global'
  2. Existe 'ui.language' @ 'global'?  ──→ SIM  → devolve 'pt'
                                        └→ NÃO  → devolve default ('pt')
Context helper Resultado
SettingsService::globalContext() 'global'
SettingsService::userContext() 'user:42' (autenticado)
SettingsService::userContext(99) 'user:99'
SettingsService::userContext($model) 'user:{$model->id}'
SettingsService::tenantContext(5) 'tenant:5'

Cast dinâmico

O value é sempre guardado como texto. O campo cast controla a deserialização:

cast Tipo PHP retornado
string string
int int
float float
bool bool
json / array array
date Carbon

Se não especificares cast, é inferido automaticamente a partir do valor:

Settings::set('ui.font_size', 14);     // cast=int  (inferido)
Settings::set('ui.dark_mode', true);   // cast=bool (inferido)
Settings::set('ui.tags', ['a', 'b']);  // cast=json (inferido)

is_locked — bloquear overrides

// Impede que qualquer contexto mais específico sobrescreva esta setting
Settings::set('general.version', '1.0.0', options: ['is_locked' => true]);
// ou após criar:
Settings::lock('general.version');

metadata — dados para o frontend

Settings::set('ui.language', 'pt', options: [
    'metadata' => [
        'input'   => 'select',
        'options' => ['pt', 'en', 'es', 'fr'],
        'label'   => 'Idioma da interface',
    ]
]);

// No controller de admin — construir formulário dinamicamente
$settings  = Settings::all('ui');
$metadatas = \Gsebastiao\LaravelSettings\Models\Setting::forNamespace('ui')->pluck('metadata', 'key');

Helpers disponíveis

settings('general.name', 'default')                        // ler
settings('ui.theme', 'light', context: 'user:42')         // ler com contexto
settings()                                                 // retorna o serviço

user_setting('ui.font_size', 14)                          // contexto do user autenticado
user_setting('ui.font_size', 14, user: $user)             // contexto de user específico

tenant_setting('ui.logo', 'logo.png', tenantId: 5)       // contexto de tenant

Estrutura do pacote

gsebastiao/laravel-settings/
├── src/
│   ├── Casts/
│   │   └── SettingValueCast.php         ← cast dinâmico por coluna
│   ├── Contracts/
│   │   └── SettingsRepository.php       ← interface (para substituição)
│   ├── Facades/
│   │   └── Settings.php                 ← facade com docblock para IDE
│   ├── Models/
│   │   └── Setting.php                  ← Eloquent, PK composta, tabela configurável
│   ├── Services/
│   │   └── SettingsService.php          ← lógica principal
│   ├── SettingsServiceProvider.php      ← registo, publish, migrations
│   └── helpers.php                      ← settings() / user_setting() / tenant_setting()
├── config/
│   └── settings.php
├── database/
│   └── migrations/
│       └── ..._create_settings_table.php
├── tests/
│   └── Unit/
│       └── SettingsServiceTest.php
├── composer.json
└── phpunit.xml

Testes

composer test
# ou
./vendor/bin/phpunit

Licença

MIT © Gsebastiao

统计信息

  • 总下载量: 0
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 0
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 0
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2026-07-03

承接程序开发

PHP开发

VUE

Vue开发

前端开发

小程序开发

公众号开发

系统定制

数据库设计

云部署

网站建设

安全加固