Aller au contenu principal

← Chargement anticipé · Retour au README · Conversions des données →

Configuration

Publier la configuration​

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

Cette commande publie config/model_settings.php et la migration du paquet.

Options disponibles​

OptionValeur par défautRôle
modelDragonCode\LaravelModelSettings\Models\SettingsModèle Eloquent utilisé pour les paramètres stockés
connectionValeur par défaut de l’applicationConnexion utilisée par le modèle et la migration
tablesettingsTable utilisée par le modèle et la migration
casts[]Conversions sélectionnées selon la classe du modèle parent et, facultativement, la clé

Le paquet lit les variables d’environnement suivantes :

VariableValeur par défaut
MODEL_SETTINGS_DATABASE_CONNECTIONDATABASE_CONNECTION, puis la connexion par défaut de Laravel
MODEL_SETTINGS_DATABASE_TABLEsettings

Définissez la connexion et la table avant d’exécuter la migration :

MODEL_SETTINGS_DATABASE_CONNECTION=mysql
MODEL_SETTINGS_DATABASE_TABLE=model_settings

La modification ultérieure de l’une de ces valeurs ne déplace pas les enregistrements existants.

Configuration des conversions​

L’ancienne forme à l’échelle du modèle reste prise en charge. Une conversion traite toutes les données appartenant à la classe du modèle :

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

Utilisez une table indexée par clé lorsque différentes clés nécessitent des types ou traitements distincts :

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

La correspondance des clés est exacte. Les points ne représentent aucun chemin imbriqué et une clé absente de la table utilise la conversion JSON par défaut. Chaque entrée de modèle est soit une chaîne de classe pour tout le modèle, soit une table indexée par clé ; aucun caractère générique n’existe dans cette table. Consultez Conversions des données pour les contrats pris en charge et une recette de chiffrement.

Schéma de stockage​

La migration publiée crée les colonnes suivantes :

ColonneRôle
idClé primaire de la ligne de paramètre
item_typeClasse morph ou alias du modèle parent
item_idIdentifiant du parent, stocké sous forme de chaîne de 36 caractères maximum
is_defaultDistingue les valeurs par défaut de classe des surcharges de modèles
keyClé du paramètre
payloadDonnées déclarées comme jsonb par la migration
created_at et updated_atHorodatages Laravel

La combinaison de item_type, item_id, is_default et key est unique. Un index de recherche sur item_type, is_default et item_id prend en charge les lectures des valeurs par défaut et de la portée du propriétaire.

Les valeurs par défaut de classe et les surcharges de modèles partagent cette table. Le paquet ne crée aucune seconde table de valeurs par défaut et n’ajoute aucune colonne de métadonnées de chiffrement.

La colonne item_id par défaut stocke au maximum 36 caractères. Les identifiants entiers, chaînes, UUID et ULID tiennent dans ce schéma lorsque leur représentation sous forme de chaîne ne dépasse pas 36 caractères. Une clé primaire personnalisée plus longue nécessite une modification correspondante de la migration.

Les valeurs par défaut de la classe utilisent item_id = '0' avec is_default = true. Un propriétaire enregistré dont la clé est l’entier 0 ou la chaîne '0' utilise le même item_id physique avec is_default = false. Les deux lignes peuvent donc coexister pour le même type de modèle et la même clé de paramètre. Si des données existent déjà, la modification de la connexion, du nom de table ou des alias de morph map nécessite de déplacer ou de mettre à jour vous-même les lignes existantes.

Mise à niveau depuis une version 1.x antérieure​

Cette version modifie le contrat d’exécution en plus de la migration du discriminateur de stockage :

Comportement des versions 1.x antérieuresComportement actuelModification requise dans l’application
set($key, null), les chaînes vides ou composées d’espaces et les tableaux vides supprimaient la ligneset() stocke chaque valeur JSON exactementRemplacez les appels de suppression par forget($key)
Les entrées vides de setMany() étaient supprimées dans le même lotChaque entrée de setMany() est stockée dans un upsert transactionnel uniquePlacez les clés à supprimer dans un appel forgetMany() séparé
Les clés vides ou composées uniquement d’espaces étaient acceptéesLes clés normalisées vides lèvent InvalidSettingKeyRenommez ou supprimez les clés invalides avant la mise à niveau
Les tests d’existence nécessitaient all()->has($key)has($key) distingue le JSON null stocké d’une clé absentePréférez la méthode ciblée has()

Une surcharge de modèle null stockée masque désormais une valeur par défaut de classe non vide jusqu’à sa suppression avec forget(). Les conversions personnalisées reçoivent maintenant les valeurs vides des deux méthodes d’écriture, et les événements de création ou de mise à jour d’un modèle de stockage personnalisé les reçoivent depuis set(). get() accepte toujours un seul argument ; aucun repli fourni par l’appelant ni alias permanent put() n’a été ajouté.

Après la mise à jour du paquet, publiez sa nouvelle migration et exécutez-la pendant que l’application est en mode maintenance :

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

La migration ajoute is_default, classe chaque ancienne ligne avec item_id = '0' comme valeur par défaut de classe, crée les index tenant compte du discriminateur, puis supprime l’ancien index unique. Elle n’écrit jamais les clés ni les données des paramètres dans sa sortie.

Les anciens schémas 1.x encodaient de la même façon les valeurs par défaut de classe et les lignes d’un véritable propriétaire d’identifiant 0. La migration ne peut donc pas distinguer une surcharge de propriétaire insérée manuellement d’une valeur par défaut et classe les deux comme valeurs par défaut. Après la migration, vérifiez les anciennes données connues des propriétaires d’identifiant 0 et définissez is_default = false pour les lignes qui sont réellement des surcharges de modèle.

N’exécutez pas l’ancienne version du paquet avec le schéma mis à niveau. Elle n’écrit pas le discriminateur et enregistrerait les valeurs par défaut comme des surcharges. Déployez la migration et la version compatible du paquet dans une même fenêtre de maintenance.

Le retour arrière n’est sûr qu’avant la création d’une véritable surcharge de propriétaire d’identifiant 0. La migration s’arrête avant de modifier le schéma si elle trouve item_id = '0' avec is_default = false, car l’ancien schéma ne peut pas représenter cette ligne sans en changer le sens. Supprimez ou exportez ces surcharges avant le retour arrière. Un retour arrière sûr restaure l’ancien index unique et supprime is_default.

Remplacer le modèle de stockage​

Le modèle de paramètres intégré est final. Configurez un remplacement au lieu d’en hériter :

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,
];
}
}

Mettez ensuite la configuration à jour :

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

Le remplacement doit rester compatible avec le schéma publié. Conservez les attributs remplissables et PayloadCast, sauf si le nouveau modèle implémente une sérialisation équivalente.

Le modèle de remplacement doit au minimum conserver les comportements suivants :

ExigenceRaison
Remplir item_type, item_id, is_default, key et payloadLe stockage écrit ces attributs
Utiliser la connexion et la table configuréesLa migration et le dépôt doivent accéder aux mêmes lignes
Convertir item_id en stringLes entiers, chaînes, UUID et ULID partagent une colonne
Convertir is_default en booleanLes résolutions différée et anticipée doivent lire le même discriminateur de portée
Convertir payload avec PayloadCast ou un équivalentLes lectures et écritures doivent conserver le comportement JSON

Voir aussi​