Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама
Laravel 14 додає метод defaults() до моделей Eloquent
Новини 02 жовтня 2026

Laravel 14 додає метод defaults() до моделей Eloquent

Моделі Eloquent задають значення атрибутів за замовчуванням через властивість $attributes. Це добре працює для фіксованих значень, але PHP дозволяє лише константні вирази у значенні властивості за замовчуванням, тому там не можна викликати config(), now() чи перевіряти feature flag. Laravel 14 додає метод defaults(), який повертає такий самий масив, але з коду, що виконується під час створення моделі.

Було і стало

Уявімо модель підписки, яка дає новим підпискам 14 днів пробного періоду, а при активному feature flag extended-trials - 30 днів. З $attributes прапорець доводиться перевіряти в конструкторі:

class Subscription extends Model
{
    protected $attributes = [
        'cancelled' => false,
        'trial_days' => 14,
    ];

    public function __construct(array $attributes = [])
    {
        if (Feature::active('extended-trials')) {
            $this->attributes['trial_days'] = 30;
        }

        parent::__construct($attributes);
    }
}

У Laravel 14 ту саму логіку можна винести в defaults():

class Subscription extends Model
{
    protected function defaults(): array
    {
        return [
            'cancelled' => false,
            'trial_days' => Feature::active('extended-trials') ? 30 : 14,
            'expires_at' => now()->addDays(config('billing.grace_period'))->toDateTimeString(),
        ];
    }
}
$subscription = new Subscription;
$subscription->trial_days; // 30 when the flag is active, 14 otherwise

У Laravel 11 з касами зробили схожий крок: скелет застосунку перейшов від властивості $casts до методу casts() (Model Casts are moving to methods in Laravel 11). Тепер defaults() дає $attributes такий самий методний варіант.

Як це працює

Конструктор моделі викликає defaults() і зливає результат у $attributes. Порядок у конструкторі визначає, яке значення матиме пріоритет:

  1. Спершу встановлюються значення з властивості $attributes.
  2. Поверх них зливається результат defaults(), тому при збігу ключів він перемагає.
  3. Атрибути, передані в new, create() або fill(), застосовуються останніми й перемагають обидва попередні джерела.
$subscription = Subscription::create(['trial_days' => 60]);
$subscription->trial_days; // 60

Дефолти зливаються до того, як модель синхронізує оригінальні атрибути, тому вони не вважаються «брудними» (dirty) змінами. Водночас вони записуються в базу даних при вставці моделі - так само, як і $attributes.

Сирі значення

Як і $attributes, значення з defaults() є сирими: вони не проходять через касти чи мутатори. Повертати потрібно те значення, яке буде збережене в базі даних:

protected function defaults(): array
{
    return [
        // A column cast to `array` expects a JSON string
        'settings' => json_encode(['theme' => 'light']),
        // A date column
        'expires_at' => now()->addDays(30)->toDateTimeString(),
    ];
}

Якщо повернути PHP-масив для колонки з кастом array або json, помилка виникне під час читання атрибута, адже каст очікує JSON-рядок.

Коли виконується defaults()

Метод defaults() викликається щоразу при створенні екземпляра моделі, зокрема й для моделей, завантажених із бази даних. Eloquent будує кожен отриманий рядок через новий екземпляр моделі, тож defaults() виконується один раз на рядок, після чого значення з рядка замінюють дефолти.

Оновлення до Laravel 14

Метод з'являється саме в Laravel 14, бо в наявній моделі вже може бути метод із назвою defaults(). У Laravel 14 конструктор викликатиме його та зливатиме все, що він поверне, в атрибути. Перед оновленням варто пошукати такі методи у своїх моделях:

grep -rn "function defaults" app/Models

Будь-який метод, який не призначений повертати значення атрибутів за замовчуванням, слід перейменувати.

Автор і статус

Метод реалізував Jack Bayliss у pull request #61688. Зміни злито в гілку master, але до релізу Laravel 14 вони ще можуть змінитися.

Додаткове читання

Джерело: Laravel News.

22

Читати в документації

Коментарі

Увійдіть, щоб залишити коментар

Будьте першим, хто залишить коментар!

Читайте також

Laravel AI SDK на практиці
Новини 09 жовтня 2026

Laravel AI SDK на практиці: агент, що стоїть за There There

Фрік Ван дер Гертен розповідає, як у Spatie побудували AI-шар хелпдеска There There на Laravel AI SDK: клас агента, інструменти з типізованою JSON-схемою та делегування роботи звичайним domain-діям.

9
CSRF і завантаження
Новини 09 жовтня 2026

Порада з безпеки: як завантаження файлів може обійти захист від CSRF

Стівен Ріс-Картер пояснює, чому файли користувачів варто віддавати з окремого домену: HTML і JS у межах основного застосунку дають доступ до cookie та CSRF-токенів.

18

Вакансії за темою

Z Global E-Commerce
12 днів тому

Full-Stack Developer (PHP/Laravel + Vue 3)

Full-Stack розробник з глибоким досвідом бекенду. Розробляєте масштабовані веб-платформи з комплексною бізнес-логікою, працюєте з PHP/Laravel, SQL, Vue 3/TypeScript. Основні вимоги: досвід з Laravel, Eloquent, проектування API, оптимізація баз даних (включно з мільйонами записів), фронтенд на Vue 3 з Composition API, TypeScript. Цінується розуміння архітектури, продуктивності й довгострокової підтримуваності коду.

Wooden Sword
13 днів тому

Senior PHP Developer (Game Backend)

Розробник backend для мобільної RPG з високим навантаженням. Основний стек: PHP Laravel API та TypeScript Nakama Game Server. Відповідальність за повний цикл розробки функцій — від логіки до тестування, code review, оптимізації та документації. Вимоги: 5+ років backend-досвіду, бездоганне знання Laravel/PHP, сильні навички TypeScript, PostgreSQL та асинхронного програмування.

Kredyt Kapital
13 днів тому

Middle Full-Stack Developer (PHP / Laravel / Vue / React)

Middle Full-Stack Developer для розробки внутрішніх IT-продуктів. Основний стек: PHP 8.3+, Laravel, PostgreSQL, REST API, Vue.js/React. Розробник займатиметься backend (бізнес-логіка, Eloquent, Jobs/Queues) і frontend (компоненти, інтерфейси), інтеграціями та оптимізацією. Вимоги: 2-3+ років комерційного досвіду з PHP, 2+ років практики з Laravel, впевнене знання PostgreSQL, Git, JavaScript ES6+.

Пакети за темою

Bagisto

bagisto/bagisto

Bagisto — це платформа для електронної комерції, побудована на Laravel. Вона надає готове рішення для створення та управління інтернет-магазинами з підтримкою каталогу товарів, замовлень, платежів та клієнтів.

28,224 v2.5.0 13 26

Lang

laravel-lang/lang

Список 126 мов для Laravel Framework, Laravel Jetstream, Laravel Fortify, Laravel Breeze, Laravel Cashier, Laravel Nova, Laravel Spark та Laravel UI.

7,779 15.37.4 12