Руководство по обновлению
Изменения с высоким уровнем влияния
Изменения со средним уровнем влияния
Изменения с низким уровнем влияния
- Carbon 3
- Сопоставление индексов результатов в Concurrency
- Разрешение зависимостей контейнера
- Проверка изображений больше не включает SVG
- Просмотр баз данных с несколькими схемами
- Слияние вложенных массивов в запросах
Обновление с 11.0 версии до 12.x
Приблизительное время обновления: 5 минут
Мы стараемся задокументировать каждое возможное изменение, которое может привести к нарушению совместимости. Поскольку некоторые из этих критических изменений находятся в малоизвестных частях фреймворка, только часть этих изменений может повлиять на ваше приложение. Хотите сэкономить время? Вы можете использовать Laravel Shift , чтобы автоматизировать процесс обновления вашего приложения.
Обновление зависимостей
Вероятность воздействия: высокая
Зависимости Composer
Обновите следующие зависимости в вашем файле composer.json
:
laravel/framework
to^12.0
phpunit/phpunit
to^11.0
pestphp/pest
to^3.0
(если установлено)
Carbon 3
Вероятность влияния: низкая
Поддержка Carbon 2.x удалена. Laravel 12 требует использования Carbon 3.x.
Обновление Laravel Installer
Если вы используете CLI-установщик Laravel, обновите его до версии, совместимой с Laravel 12.x и новыми стартер-китами.
Если установили через composer global require
, выполните:
composer global update laravel/installer
Если устанавливали Laravel через php.new
, просто повторите установку для своей ОС:
macOS:
/bin/bash -c "$(curl -fsSL https://php.new/install/mac/8.4)"
Windows (PowerShell, от имени администратора):
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'))
Linux:
/bin/bash -c "$(curl -fsSL https://php.new/install/linux/8.4)"
Если вы используете Laravel Herd, обновите его до последней версии.
Аутентификация
Обновлённая сигнатура конструктора DatabaseTokenRepository
Вероятность влияния: очень низкая
Теперь конструктор класса Illuminate\Auth\Passwords\DatabaseTokenRepository
ожидает параметр $expires
в секундах, а не в минутах.
Concurrency
Сопоставление индексов результатов
Вероятность влияния: низкая
Теперь при использовании Concurrency::run
с ассоциативным массивом, ключи сохраняются в результатах:
$result = Concurrency::run([
'task-1' => fn () => 1 + 1,
'task-2' => fn () => 2 + 2,
]);
// ['task-1' => 2, 'task-2' => 4]
Контейнер
Разрешение зависимостей класса
Вероятность влияния: низкая
Контейнер теперь учитывает значения по умолчанию свойств при разрешении зависимостей:
class Example
{
public function __construct(public ?Carbon $date = null) {}
}
$example = resolve(Example::class);
// До 12.x
$example->date instanceof Carbon;
// С 12.x
$example->date === null;
База данных
Просмотр баз с несколькими схемами
Вероятность влияния: низкая
Методы Schema::getTables()
, getViews()
, getTypes()
теперь возвращают результаты по всем схемам по умолчанию:
$tables = Schema::getTables(); // Все таблицы во всех схемах
$table = Schema::getTables(schema: 'main'); // Только схема 'main'
$table = Schema::getTables(schema: ['main', 'blog']); // Несколько схем
Метод Schema::getTableListing()
теперь возвращает имена таблиц с префиксом схемы:
Schema::getTableListing();
// ['main.migrations', 'main.users', 'blog.posts']
Schema::getTableListing(schema: 'main');
// ['main.migrations', 'main.users']
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 v4 с упорядоченными значениями, используйте трейт HasVersion4Uuids
:
use Illuminate\Database\Eloquent\Concerns\HasUuids; // Удалить
use Illuminate\Database\Eloquent\Concerns\HasVersion4Uuids as HasUuids; // Добавить
Трейт HasVersion7Uuids
удалён — теперь его заменяет HasUuids
.
Requests
Слияние вложенных массивов
Вероятность влияния: низкая
Метод $request->mergeIfMissing()
теперь поддерживает слияние с помощью “dot” нотации:
$request->mergeIfMissing([
'user.last_name' => 'Otwell',
]);
Если раньше вы рассчитывали, что ключ 'user.last_name'
создаст одноуровневый массив — пересмотрите логику.
Валидация
Правило image больше не пропускает SVG
Теперь по умолчанию SVG-файлы не считаются изображениями при использовании правила image
. Чтобы разрешить SVG, укажите это явно:
'photo' => 'required|image:allow_svg'
// Или с использованием объекта правил:
'photo' => ['required', File::image(allowSvg: true)],
Разное
Мы также рекомендуем вам просмотреть изменения в laravel/laravel
репозиторий GitHub. Хотя многие из этих изменений не обязательны, вы можете захотеть синхронизировать эти файлы с вашим приложением. Некоторые из этих изменений будут описаны в этом руководстве по обновлению, а другие, например изменения в файлах конфигурации или комментариях, не будут рассмотрены. Вы можете легко просмотреть изменения с помощью инструмента сравнения GitHub и выбрать, какие обновления важны для вас.