Перайсці да асноўнага змесціва

← Папярэдняя загрузка · Вярнуцца да README · Пераўтварэнні даных →

Канфігурацыя

Публікацыя канфігурацыі​

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

Каманда публікуе config/model_settings.php і міграцыю пакета.

Даступныя параметры​

ПараметрЗначэнне па змаўчанніПрызначэнне
modelDragonCode\LaravelModelSettings\Models\SettingsEloquent-мадэль для захаваных налад
connectionСтандартнае для праграмыПадключэнне да базы даных для мадэлі і міграцыі
tablesettingsТабліца базы даных для мадэлі і міграцыі
casts[]Пераўтварэнні даных, выбраныя па класе бацькоўскай мадэлі і, пры патрэбе, ключы налады

Пакет чытае наступныя зменныя асяроддзя:

ЗменнаяЗначэнне па змаўчанні
MODEL_SETTINGS_DATABASE_CONNECTIONDATABASE_CONNECTION, затым стандартнае падключэнне Laravel
MODEL_SETTINGS_DATABASE_TABLEsettings

Задайце падключэнне і табліцу да запуску міграцыі:

MODEL_SETTINGS_DATABASE_CONNECTION=mysql
MODEL_SETTINGS_DATABASE_TABLE=model_settings

Пазнейшае змяненне гэтых параметраў не пераносіць наяўныя запісы.

Налада пераўтварэнняў даных​

Сумяшчальная форма для ўсёй мадэлі па-ранейшаму падтрымліваецца. Адзін клас пераўтварэння апрацоўвае ўсе даныя, што належаць класу мадэлі:

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

Выкарыстоўвайце карту па ключах, калі розным наладам патрэбны розныя тыпы або апрацоўка:

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

Ключы супастаўляюцца дакладна. Кропкі не азначаюць укладзены шлях, а адсутны ў карце ключ выкарыстоўвае стандартнае JSON-пераўтварэнне. Запіс кожнай мадэлі задаецца або радком класа для ўсёй мадэлі, або картай па ключах; сімвала падстаноўкі ўнутры карты няма. Падтрыманыя кантракты і прыклад шыфравання апісаны ў раздзеле Пераўтварэнні даных.

Схема захоўвання​

Апублікаваная міграцыя стварае наступныя слупкі:

СлупокПрызначэнне
idПершасны ключ радка налады
item_typeMorph-клас бацькоўскай мадэлі або псеўданім
item_idІдэнтыфікатар бацькоўскай мадэлі як радок даўжынёй да 36 сімвалаў
is_defaultАдрознівае значэнні класа па змаўчанні ад перавызначэнняў мадэляў
keyКлюч налады
payloadДаныя, абвешчаныя ў міграцыі як jsonb
created_at і updated_atЧасавыя пазнакі Laravel

Спалучэнне item_type, item_id, is_default і key унікальнае. Індэкс пошуку па item_type, is_default і item_id падтрымлівае чытанне значэнняў па змаўчанні і вобласці ўладальніка.

Значэнні класа па змаўчанні і перавызначэнні мадэляў знаходзяцца ў адной табліцы. Пакет не стварае другую табліцу значэнняў па змаўчанні і не дадае слупкі з метаданымі шыфравання.

Стандартны слупок item_id захоўвае не больш за 36 сімвалаў. У гэтую схему змяшчаюцца цэлалікавыя, радковыя, UUID- і ULID-ідэнтыфікатары, калі іх радковае прадстаўленне не даўжэйшае за 36 сімвалаў. Для даўжэйшага карыстальніцкага першаснага ключа патрэбна адпаведнае змяненне міграцыі.

Значэнні класа па змаўчанні выкарыстоўваюць item_id = '0' з is_default = true. Захаваны ўладальнік з цэлалікавым ключом 0 або радковым '0' выкарыстоўвае тое ж фізічнае значэнне item_id з is_default = false, таму абодва радкі могуць існаваць для аднаго тыпу мадэлі і ключа налады. Калі даныя ўжо існуюць, змяненне падключэння, назвы табліцы або псеўданімаў morph map патрабуе самастойнага пераносу або абнаўлення радкоў.

Абнаўленне з папярэдняй версіі 1.x​

Гэты выпуск змяняе кантракт выканання ў дадатак да міграцыі дыскрымінатара сховішча:

Паводзіны папярэдняй 1.xБягучыя паводзіныНеабходнае змяненне праграмы
set($key, null), пустыя радкі, радкі з прабелаў і пустыя масівы выдалялі радокset() дакладна захоўвае кожнае JSON-значэннеЗамяніце выклікі выдалення на forget($key)
Пустыя элементы ў setMany() выдаляліся ў тым жа пакецеКожны элемент setMany() захоўваецца адным транзакцыйным upsertПеранясіце ключы для выдалення ў асобны выклік forgetMany()
Пустыя ключы і ключы толькі з прабелаў прымалісяНармалізаваныя пустыя ключы выклікаюць InvalidSettingKeyПераназавіце або выдаліце няправільныя ключы да абнаўлення
Для праверкі наяўнасці быў патрэбны all()->has($key)has($key) адрознівае захаваны JSON null ад адсутнага ключаВыкарыстоўвайце спецыялізаваны метад has()

Захаванае перавызначэнне мадэлі са значэннем null цяпер хавае запоўненае значэнне класа па змаўчанні, пакуль forget() не выдаліць перавызначэнне. Карыстальніцкія пераўтварэнні даных цяпер атрымліваюць пустыя значэнні з абодвух setter-метадаў, а падзеі стварэння або абнаўлення карыстальніцкай мадэлі сховішча атрымліваюць іх з set(). get() па-ранейшаму прымае толькі адзін аргумент; рэзервовае значэнне ад выклікальніка і пастаянны псеўданім put() не дададзены.

Пасля абнаўлення пакета апублікуйце новую міграцыю і запусціце яе ў рэжыме абслугоўвання праграмы:

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

Міграцыя дадае is_default, адносіць усе ранейшыя радкі з item_id = '0' да значэнняў класа па змаўчанні, стварае індэксы з дыскрымінатарам і затым выдаляе ранейшы ўнікальны індэкс. Яна не выводзіць ключы або даныя налад.

У папярэдняй схеме 1.x значэнні класа па змаўчанні і радкі рэальнага ўладальніка з ідэнтыфікатарам 0 захоўваліся аднолькава. Таму міграцыя не можа адрозніць дададзенае ўручную перавызначэнне ўладальніка ад значэння па змаўчанні і адносіць абодва радкі да значэнняў па змаўчанні. Пасля міграцыі праверце вядомыя ранейшыя даныя ўладальнікаў з ідэнтыфікатарам 0 і ўсталюйце is_default = false для радкоў, якія з'яўляюцца перавызначэннямі мадэляў.

Не запускайце папярэднюю версію пакета з абноўленай схемай. Яна не запісвае дыскрымінатар і захавае значэнні па змаўчанні як перавызначэнні. Разгортвайце міграцыю і сумяшчальную версію пакета ў адной мяжы рэжыму абслугоўвання.

Адкат бяспечны толькі да з'яўлення рэальнага перавызначэння ўладальніка з ідэнтыфікатарам 0. Міграцыя спыняецца да змянення схемы, калі знаходзіць item_id = '0' з is_default = false, бо папярэдняя схема не можа прадставіць такі радок без змянення яго сэнсу. Выдаліце або экспартуйце гэтыя перавызначэнні перад адкатам. Бяспечны адкат аднаўляе ранейшы ўнікальны індэкс і выдаляе is_default.

Замена мадэлі захоўвання​

Убудаваная мадэль налад абвешчана як final. Замест наследавання наладзьце замену:

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

Затым абнавіце канфігурацыю:

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

Замена павінна заставацца сумяшчальнай з апублікаванай схемай. Захавайце запаўняльныя атрыбуты і PayloadCast, калі новая мадэль не рэалізуе эквівалентную серыялізацыю.

Як мінімум новая мадэль павінна захоўваць наступныя паводзіны:

ПатрабаваннеПрычына
Запаўняць item_type, item_id, is_default, key і payloadСховішча запісвае гэтыя атрыбуты
Выкарыстоўваць наладжаныя падключэнне і табліцуМіграцыя і рэпазіторый павінны звяртацца да адных радкоў
Пераўтвараць item_id у stringЦэлыя лікі, радкі, UUID і ULID захоўваюцца ў адным слупку
Пераўтвараць is_default у booleanЛянівая і папярэдняя загрузка павінны чытаць адзін дыскрымінатар вобласці
Пераўтвараць payload праз PayloadCast або эквівалентЧытанне і запіс павінны захоўваць паводзіны JSON

Гл. таксама​