Любите загадки? Событие всё ещё доступно на сайте

Руководство по обновлению

Вы просматриваете документ для прошлой версии.
Рассмотрите возможность обновления вашего проекта до актуальной версии 13.x. Почему это важно?
На этой странице

Изменения с высоким уровнем влияния

Изменения со средним уровнем влияния

Изменения с низким уровнем влияния

Обновление с 11.x до 12.0

Оценочное время обновления: 5 минут

Мы стараемся документировать все возможные breaking changes. Поскольку часть этих изменений находится в редко используемых областях фреймворка, только часть из них может затронуть ваше приложение. Хотите сэкономить время? Вы можете использовать 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(); // Все таблицы во всех схемах

$tables = Schema::getTables(schema: 'main'); // Только схема 'main'

$tables = Schema::getTables(schema: ['main', 'blog']); // Несколько схем

Метод Schema::getTableListing() теперь возвращает имена таблиц с префиксом схемы:

$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).

Изменения сигнатур конструкторов базы данных

Вероятность влияния: очень низкая

В Laravel 12 нескольким низкоуровневым классам базы данных теперь требуется экземпляр Illuminate\Database\Connection, передаваемый через конструктор.

Эти изменения в основном относятся к сопровождающим пакетов для базы данных — крайне маловероятно, что они повлияют на обычную разработку приложений.

Illuminate\Database\Schema\Blueprint

Конструктор класса Illuminate\Database\Schema\Blueprint теперь ожидает экземпляр Connection первым аргументом. Это в основном затрагивает приложения или пакеты, которые вручную создают экземпляры Blueprint.

Illuminate\Database\Grammar

Конструктор класса Illuminate\Database\Grammar теперь также требует экземпляр Connection. В предыдущих версиях соединение назначалось после создания с помощью метода setConnection(). Этот метод удалён в Laravel 12:

// Laravel <= 11.x
$grammar = new MySqlGrammar;
$grammar->setConnection($connection);

// Laravel >= 12.x
$grammar = new MySqlGrammar($connection);

Кроме того, следующие API были удалены или устарели:

  • Метод Blueprint::getPrefix() устарел.
  • Метод Connection::withTablePrefix() удалён.
  • Методы Grammar::getTablePrefix() и setTablePrefix() устарели.
  • Метод Grammar::setConnection() удалён.

При работе с префиксами таблиц теперь следует получать их напрямую из соединения с базой данных:

$prefix = $connection->getTablePrefix();

Если вы сопровождаете пользовательские драйверы базы данных, schema builders или реализации grammar, проверьте их конструкторы и убедитесь, что передаётся экземпляр 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' создаст одноуровневый массив — пересмотрите логику.

Маршрутизация

Приоритет маршрутов

Вероятность влияния: низкая

Поведение маршрутизации при наличии нескольких маршрутов с одинаковым именем было унифицировано для кешированных и некешированных маршрутов. Это означает, что некешированная маршрутизация теперь сопоставляет первый зарегистрированный маршрут с заданным именем, а не последний.

Хранилище

Корневой путь по умолчанию для локального диска файловой системы

Вероятность влияния: низкая

Если ваше приложение явно не определяет local диск в конфигурации файловой системы, Laravel теперь будет по умолчанию использовать storage/app/private в качестве корня локального диска. В предыдущих версиях это был storage/app. В результате вызовы Storage::disk('local') будут читать и записывать данные в storage/app/private, если не указано иное. Чтобы восстановить прежнее поведение, вы можете вручную определить local диск и указать нужный путь к корню.

Валидация

Правило image больше не пропускает SVG

Вероятность влияния: низкая

Теперь по умолчанию SVG-файлы не считаются изображениями при использовании правила image. Чтобы разрешить SVG, укажите это явно:

'photo' => 'required|image:allow_svg'

// Или с использованием объекта правил:
'photo' => ['required', File::image(allowSvg: true)],

Разное

Мы также рекомендуем вам просмотреть изменения в laravel/laravel репозиторий GitHub. Хотя многие из этих изменений не обязательны, вы можете захотеть синхронизировать эти файлы с вашим приложением. Некоторые из этих изменений будут описаны в этом руководстве по обновлению, а другие, например изменения в файлах конфигурации или комментариях, не будут рассмотрены. Вы можете легко просмотреть изменения с помощью инструмента сравнения GitHub и выбрать, какие обновления важны для вас.