← Папярэдняя загрузка · Вярнуцца да README · Пераўтварэнні даных →
Канфігурацыя
Публікацыя канфігурацыі
php artisan vendor:publish --tag="model_settings"
Каманда публікуе config/model_settings.php і міграцыю пакета.
Даступныя параметры
| Параметр | Значэнне па змаўчанні | Прызначэнне |
|---|---|---|
model | DragonCode\LaravelModelSettings\Models\Settings | Eloquent-мадэль для захаваных налад |
connection | Стандартнае для праграмы | Падключэнне да базы даных для мадэлі і міграцыі |
table | settings | Табліца базы даных для мадэлі і міграцыі |
casts | [] | Пераўтварэнні даных, выбраныя па класе бацькоўскай мадэлі і, пры патрэбе, ключы налады |
Пакет чытае наступныя зменныя асяроддзя:
| Зменная | Значэнне па змаўчанні |
|---|---|
MODEL_SETTINGS_DATABASE_CONNECTION | DATABASE_CONNECTION, затым стандартнае падключэнне Laravel |
MODEL_SETTINGS_DATABASE_TABLE | settings |
Задайце падключэнне і табліцу да запуску міграцыі:
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_type | Morph-клас бацькоўскай мадэлі або псеўданім |
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 |
Гл. таксама
- Пачатак працы — публікацыя канфігурацыі і міграцыі.
- Пераўтварэнні даных — налада прыкладных тыпаў даных.
- Даведнік API — публічная паверхня пакета.