Посібник з оновлення

Зміни з високим впливом

Зміни середнього впливу

Зміни низького впливу

Оновлення до 12.0 з 11.x

Орієнтовний час оновлення: 5 хвилин

Ми намагаємося документувати всі можливі критичні зміни. Оскільки деякі з цих критичних змін стосуються маловідомих частин фреймворку, лише частина з них може фактично вплинути на ваш застосунок. Хочете заощадити час? Ви можете скористатися Laravel Shift, щоб автоматизувати оновлення вашого застосунку.

Оновлення залежностей

Ймовірність Впливу: Висока

Ви повинні оновити наступні залежності у файлі composer.json вашого застосунку:

  • laravel/framework до ^12.0
  • phpunit/phpunit до ^11.0
  • pestphp/pest до ^3.0

Carbon 3

Ймовірність Впливу: Низька

Підтримка Carbon 2.x була видалена. Всі застосунки Laravel 12 тепер вимагають Carbon 3.x.

Оновлення Laravel Installer

Якщо ви використовуєте CLI-інструмент Laravel installer для створення нових Laravel застосунків, вам слід оновити вашу установку інсталятора, щоб вона була сумісна з Laravel 12.x та новими стартовими наборами Laravel. Якщо ви встановили Laravel installer через composer global require, ви можете оновити інсталятор за допомогою composer global update:

composer global update laravel/installer

Якщо ви спочатку встановили PHP та Laravel через php.new, ви можете просто повторно виконати команди встановлення php.new для вашої операційної системи, щоб встановити останню версію PHP та інсталятор Laravel:

/bin/bash -c "$(curl -fsSL https://php.new/install/mac/8.4)"
# Запустити від імені адміністратора...
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://php.new/install/windows/8.4'))
/bin/bash -c "$(curl -fsSL https://php.new/install/linux/8.4)"

Або, якщо ви використовуєте вбудовану копію інсталятора Laravel у Laravel Herd, вам слід оновити вашу установку Herd до останнього релізу.

Аутентифікація

Оновлений підпис конструктора DatabaseTokenRepository

Ймовірність Впливу: Дуже Низька

Конструктор класу Illuminate\Auth\Passwords\DatabaseTokenRepository тепер очікує, що параметр $expires буде вказано в секундах, а не в хвилинах.

Конкурентність

Відображення Індексу Результатів Конкурентності

Ймовірність Впливу: Низька

Коли викликається метод Concurrency::run з асоціативним масивом, результати паралельних операцій тепер повертаються з їхніми відповідними ключами:

$result = Concurrency::run([
    'task-1' => fn () => 1 + 1,
    'task-2' => fn () => 2 + 2,
]);
 
// ['task-1' => 2, 'task-2' => 4]

Контейнер

Розв'язання залежностей класу Container

Ймовірність Впливу: Низька

Контейнер впровадження залежностей тепер враховує значення за замовчуванням властивостей класу при вирішенні екземпляра класу. Якщо раніше ви покладалися на контейнер для вирішення екземпляра класу без значення за замовчуванням, можливо, вам потрібно буде налаштувати ваш застосунок, щоб врахувати цю нову поведінку:

class Example
{
    public function __construct(public ?Carbon $date = null) {}
}
 
$example = resolve(Example::class);
 
// <= 11.x
$example->date instanceof Carbon;
 
// >= 12.x
$example->date === null;

База даних

Інспектування Багатосхемної Бази Даних

Ймовірність Впливу: Низька

Методи Schema::getTables(), Schema::getViews() та Schema::getTypes() тепер за замовчуванням включають результати з усіх схем. Ви можете передати аргумент schema, щоб отримати результат лише для заданої схеми:

// Усі таблиці на всіх схемах...
$tables = Schema::getTables();
 
// Усі таблиці в схемі 'main'...
$tables = Schema::getTables(schema: 'main');
 
// Усі таблиці в схемах 'main' та 'blog'...
$tables = Schema::getTables(schema: ['main', 'blog']);

Метод Schema::getTableListing() тепер за замовчуванням повертає імена таблиць у крапковій нотації (із зазначенням схеми). Ви можете передати аргумент schemaQualified, щоб змінити цю поведінку за потреби:

$tables = Schema::getTableListing();
// ['main.migrations', 'main.users', 'blog.posts']
 
$tables = Schema::getTableListing(schema: 'main');
// ['main.migrations', 'main.users']
 
$tables = Schema::getTableListing(schema: 'main', schemaQualified: false);
// ['migrations', 'users']

Команди db:table та db:show тепер виводять результати всіх схем на MySQL, MariaDB та SQLite, так само як PostgreSQL та SQL Server.

Оновлений підпис конструктора Blueprint

Ймовірність Впливу: Дуже Низька

Конструктор класу Illuminate\Database\Schema\Blueprint тепер очікує екземпляр Illuminate\Database\Connection як свій перший аргумент.

Eloquent

Моделі та UUIDv7

Ймовірність Впливу: Середня

Тепер трейд HasUuids повертає UUID, які сумісні з версією 7 специфікації UUID (упорядковані UUID). Якщо ви хочете продовжувати використовувати упорядковані рядки UUIDv4 для ідентифікаторів ваших моделей, тепер слід використовувати трейд HasVersion4Uuids:

use Illuminate\Database\Eloquent\Concerns\HasUuids; 
use Illuminate\Database\Eloquent\Concerns\HasVersion4Uuids as HasUuids; 

Трейт HasVersion7Uuids було видалено. Якщо ви раніше використовували цей трейт, вам слід використовувати трейт HasUuids, який тепер забезпечує таку ж поведінку.

Запити

Злиття вкладених масивів запиту

Ймовірність Впливу: Низька

Метод $request->mergeIfMissing() тепер дозволяє об'єднувати вкладені дані масиву, використовуючи крапкову нотацію. Якщо ви раніше покладалися на цей метод для створення ключа верхнього рівня, що містить версію ключа в крапковій нотації, можливо, вам потрібно буде налаштувати ваш застосунок, щоб врахувати цю нову поведінку:

$request->mergeIfMissing([
    'user.last_name' => 'Otwell',
]);

Валідація

Валідація зображень тепер виключає SVG

Правило валідації image більше не дозволяє SVG-зображення за замовчуванням. Якщо ви хочете дозволити SVG при використанні правила image, ви повинні явно дозволити їх:

use Illuminate\Validation\Rules\File;
 
'photo' => 'required|image:allow_svg'
 
// Або...
'photo' => ['required', File::image(allowSvg: true)],

Різне

Ми також заохочуємо вас переглянути зміни в laravel/laravel репозиторії GitHub. Хоча багато з цих змін не є обов'язковими, ви можете захотіти тримати ці файли у відповідності з вашим застосунком. Деякі з цих змін будуть розглянуті в цьому посібнику з оновлення, але інші, такі як зміни в конфігураційних файлах або коментарях, не будуть. Ви можете легко переглянути зміни за допомогою інструменту порівняння GitHub і вибрати, які оновлення є важливими для вас.