Любите загадки? Событие еще доступно на сайте.
Поддержите нас - каждый вклад важен!
Поддержите нас - каждый вклад важен!

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

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

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

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

Обновление с 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 и выбрать, какие обновления важны для вас.