Zum Hauptinhalt springen

← Eager Loading · Zurück zur README · Payload-Casts →

Konfiguration

Konfiguration veröffentlichen​

php artisan vendor:publish --tag="model_settings"

Dadurch werden config/model_settings.php und die Paketmigration veröffentlicht.

Verfügbare Optionen​

OptionStandardwertZweck
modelDragonCode\LaravelModelSettings\Models\SettingsEloquent-Modell für gespeicherte Einstellungen
connectionAnwendungsstandardDatenbankverbindung für Modell und Migration
tablesettingsDatenbanktabelle für Modell und Migration
casts[]Nach der Klasse des übergeordneten Modells und optional nach Einstellungsschlüssel ausgewählte Payload-Casts

Das Paket liest folgende Umgebungsvariablen:

VariableStandardwert
MODEL_SETTINGS_DATABASE_CONNECTIONDATABASE_CONNECTION, danach Laravels Standardverbindung
MODEL_SETTINGS_DATABASE_TABLEsettings

Lege Verbindung und Tabelle vor dem Ausführen der Migration fest:

MODEL_SETTINGS_DATABASE_CONNECTION=mysql
MODEL_SETTINGS_DATABASE_TABLE=model_settings

Eine spätere Änderung verschiebt keine vorhandenen Datensätze.

Payload-Cast-Konfiguration​

Die bisherige modellweite Form wird weiterhin unterstützt. Ein Cast verarbeitet jeden Payload der Modellklasse:

'casts' => [
App\Models\User::class => App\Casts\UserSettingsPayloadCast::class,
],

Verwende eine schlüsselbezogene Map, wenn unterschiedliche Schlüssel unterschiedliche Typen oder Behandlungen benötigen:

'casts' => [
App\Models\User::class => [
'profile' => App\Data\ProfileData::class,
'billing.credentials' => App\Casts\EncryptedSettingPayload::class,
],
],

Schlüssel werden exakt abgeglichen. Punkte haben keine Bedeutung als verschachtelte Pfade. Ein in der Map fehlender Schlüssel verwendet den standardmäßigen JSON-Cast. Jeder Modelleintrag ist entweder ein modellweiter Klassenname oder eine schlüsselbezogene Map; innerhalb einer solchen Map gibt es keinen Platzhaltereintrag. Unterstützte Cast-Verträge und ein Verschlüsselungsbeispiel stehen unter Payload-Casts.

Speicherschema​

Die veröffentlichte Migration erstellt folgende Spalten:

SpalteZweck
idPrimärschlüssel der Einstellungszeile
item_typeMorph-Klasse oder Alias des übergeordneten Modells
item_idID des übergeordneten Modells als Zeichenfolge mit bis zu 36 Zeichen
is_defaultUnterscheidet Klassenstandards von Modellüberschreibungen
keyEinstellungsschlüssel
payloadIn der Migration als jsonb deklarierter Payload
created_at und updated_atLaravel-Zeitstempel

Die Kombination aus item_type, item_id, is_default und key ist eindeutig. Ein Suchindex auf item_type, is_default und item_id unterstützt Lesevorgänge für Standard- und Besitzerbereiche.

Klassenstandards und Modellüberschreibungen verwenden dieselbe Tabelle. Das Paket erstellt weder eine zweite Standardwerttabelle noch Spalten für Verschlüsselungsmetadaten.

Die Standardspalte item_id speichert höchstens 36 Zeichen. Ganzzahlige IDs, Zeichenfolgen, UUIDs und ULIDs passen in dieses Schema, wenn ihre Zeichenfolgendarstellung höchstens 36 Zeichen lang ist. Ein längerer benutzerdefinierter Primärschlüssel erfordert eine entsprechende Änderung der Migration.

Klassenstandards verwenden item_id = '0' mit is_default = true. Ein gespeicherter Besitzer mit der Ganzzahl 0 oder der Zeichenfolge '0' als Schlüssel verwendet dieselbe physische item_id mit is_default = false. Dadurch können beide Zeilen für denselben Modelltyp und Einstellungsschlüssel nebeneinander bestehen. Werden Datenbankverbindung, Tabellenname oder Morph-Map-Aliase geändert, nachdem Daten vorhanden sind, müssen die bestehenden Zeilen selbst verschoben oder aktualisiert werden.

Upgrade von einer früheren 1.x-Version​

Diese Version ändert zusätzlich zur Migration des Speicherdiskriminators den Laufzeitvertrag:

Verhalten früherer 1.x-VersionenAktuelles VerhaltenErforderliche Anwendungsänderung
set($key, null), leere Zeichenfolgen, Leerzeichenfolgen und leere Arrays löschten die Zeileset() speichert jeden JSON-Wert exaktLöschaufrufe durch forget($key) ersetzen
Leere Einträge in setMany() wurden im selben Batch gelöschtJeder setMany()-Eintrag wird in einem transaktionalen Upsert gespeichertZu löschende Schlüssel in einen separaten forgetMany()-Aufruf verschieben
Leere Schlüssel und reine Leerzeichenschlüssel wurden akzeptiertNormalisierte leere Schlüssel lösen InvalidSettingKey ausUngültige Schlüssel vor dem Upgrade umbenennen oder entfernen
Existenzprüfungen erforderten all()->has($key)has($key) unterscheidet gespeichertes JSON-null von einem fehlenden SchlüsselDie gezielte Methode has() verwenden

Eine gespeicherte Modellüberschreibung mit null verdeckt nun einen gefüllten Klassenstandard, bis forget() die Überschreibung entfernt. Benutzerdefinierte Payload-Casts erhalten jetzt leere Werte von beiden Settern; Create- oder Update-Events eines benutzerdefinierten Speichermodells erhalten sie von set(). get() akzeptiert weiterhin nur ein Argument; weder ein Ersatzwert des Aufrufers noch ein dauerhafter put()-Alias wurde hinzugefügt.

Veröffentliche nach dem Paket-Update die neue Migration und führe sie aus, während sich die Anwendung im Wartungsmodus befindet:

php artisan vendor:publish --tag="model_settings"
php artisan migrate

Die Upgrade-Migration fügt is_default hinzu, klassifiziert jede bestehende Zeile mit item_id = '0' als Klassenstandard, erstellt Diskriminator-basierte Indizes und entfernt danach den alten eindeutigen Index. Sie schreibt keine Einstellungsschlüssel oder Payloads in die Ausgabe.

Frühere 1.x-Schemata kodierten Klassenstandards und echte Besitzerzeilen mit ID 0 identisch. Die Migration kann daher eine manuell eingefügte Besitzerüberschreibung nicht von einem Standardwert unterscheiden und klassifiziert beide als Standards. Prüfe nach der Migration bekannte Altdaten für Besitzer-ID 0 und setze is_default = false für Zeilen, die tatsächliche Modellüberschreibungen sind.

Führe die alte Paketversion nicht gegen das aktualisierte Schema aus. Sie schreibt den Diskriminator nicht und würde Standards als Überschreibungen speichern. Stelle Migration und kompatible Paketversion innerhalb desselben Wartungsfensters bereit.

Ein Rollback ist nur sicher, bevor eine echte Überschreibung für Besitzer-ID 0 existiert. Die Migration stoppt vor einer Schemaänderung, wenn sie item_id = '0' mit is_default = false findet, weil das alte Schema diese Zeile nicht ohne Bedeutungsänderung darstellen kann. Entferne oder exportiere diese Überschreibungen vor dem Rollback. Ein sicherer Rollback stellt den alten eindeutigen Index wieder her und entfernt is_default.

Speichermodell ersetzen​

Das integrierte Einstellungsmodell ist final. Konfiguriere einen Ersatz, statt es zu erweitern:

namespace App\Models;

use DragonCode\LaravelModelSettings\Casts\PayloadCast;
use Illuminate\Database\Eloquent\Model;

final class ApplicationSetting extends Model
{
protected $fillable = [
'item_type',
'item_id',
'is_default',
'key',
'payload',
];

public function __construct(array $attributes = [])
{
$this->setConnection(config('model_settings.connection'));
$this->setTable(config('model_settings.table'));

parent::__construct($attributes);
}

protected function casts(): array
{
return [
'item_id' => 'string',
'is_default' => 'boolean',
'payload' => PayloadCast::class,
];
}
}

Aktualisiere danach die Konfiguration:

'model' => App\Models\ApplicationSetting::class,

Der Ersatz muss mit dem veröffentlichten Schema kompatibel bleiben. Behalte die ausfüllbaren Attribute und PayloadCast bei, sofern das neue Modell keine gleichwertige Serialisierung implementiert.

Das Ersatzmodell muss mindestens folgende Verhaltensweisen erhalten:

AnforderungGrund
item_type, item_id, is_default, key und payload befüllenDer Speicher schreibt diese Attribute
Konfigurierte Verbindung und Tabelle verwendenMigration und Repository müssen dieselben Zeilen ansprechen
item_id als string castenGanzzahlen, Zeichenfolgen, UUIDs und ULIDs teilen sich eine Spalte
is_default als boolean castenLazy und Eager Resolution müssen denselben Bereichsdiskriminator lesen
payload mit PayloadCast oder gleichwertig castenLesen und Schreiben müssen das JSON-Verhalten erhalten

Siehe auch​

  • Erste Schritte — Konfiguration und Migration veröffentlichen.
  • Payload-Casts — anwendungsspezifische Payload-Typen konfigurieren.
  • API-Referenz — die öffentliche Oberfläche des Pakets ansehen.