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

Мы постарались задокументировать все возможные критические изменения. Поскольку некоторые из них находятся в малоизвестных частях фреймворка, только часть этих изменений может повлиять на ваше приложение. Приблизительное время обновления: 10 минут.

Требуется PHP 8.1

Новая минимальная версия PHP теперь 8.1.0.

Требуется Composer 2.2.0

Laravel теперь требует Composer 2.2.0 или выше.

Обновление зависимостей

Composer

Обновите следующие зависимости в своем файле composer.json

  • laravel/framework до ^10.0
  • spatie/laravel-ignition до ^2.0

Минимальная стабильность

Вы должны обновить настройку minimum-stability в composer.json до stable:

"minimum-stability": "stable",

КЭШ

Теги кэша Redis

Поддержка тегов кеша Redis была переписана для повышения производительности и эффективности хранения. В предыдущих версиях Laravel устаревшие теги накапливались в кеше при использовании Redis в качестве драйвера кеша вашего приложения.

Чтобы правильно удалить устаревшие теги кеша, новая artisan-команда cache:prune-stale-tags должна быть запланирована в классе App\Console\Kernel вашего приложения:

$schedule->command('cache:prune-stale-tags')->hourly();

База данных

Database Expressions

«Выражения» базы данных (обычно генерируемые с помощью DB::raw) были переделаны для того, чтобы предложить дополнительный функционал в будущем. Преобразование выражения в строку с помощью (string) больше не поддерживается — «сырое» строковое значение теперь должно быть получено с помощью getValue(Grammar $grammar).

Как правило, это не повлияет на имеющиеся приложения. Но, если вы вручную преобразуете выражения с помощью (string) или напрямую вызываете метод __toString для него, то вам следует обновить свой код и, вместо этого, вызывать метод getValue:

use Illuminate\Support\Facades\DB;

$expression = DB::raw('select 1');

$string = $expression->getValue(DB::connection()->getQueryGrammar());

Query Exception конструктор

Конструктор Illuminate\Database\QueryException теперь принимает строку с именем подключения в качестве первого аргумента. Если ваше приложение выбрасывает это исключение, то необходимо исправить ваш код.

ULID Columns

Когда миграции вызывают метод ulid без каких-либо аргументов, то поле будет называться ulid. В предыдущих версиях Laravel создавалось поле uuid:

$table->ulid();

Чтобы явно указать имя поля при вызове метода ulid, вы можете передать его имя методу:

$table->ulid('ulid');

Eloquent

Свойства «Dates» в модели

Устаревшее свойство Eloquent-модели $dates удалено. Теперь ваше приложение должно использовать свойство $casts:

protected $casts = [
    'deployed_at' => 'datetime',
];

Метод отношений getBaseQuery

Метод getBaseQuery класса Illuminate\Database\Eloquent\Relations\Relation был переименован в toBase.

Локализация

Директория с языками

Скелет приложения Laravel по умолчанию больше не содержит директорию lang. Теперь, при необходимости, её можно создать при помощи artisan-команды lang:publish:

php artisan lang:publish

Логирование

Monolog 3

Monolog был обновлён до версии 3.x. Если вы напрямую взаимодействуете с Monolog в своем приложении, вам следует ознакомиться с руководством по обновлению Monolog.

Очереди

Метод Bus::dispatchNow

Устаревшие методы Bus::dispatchNow и dispatch_now были удалены. Вместо этого ваше приложение должно использовать соответственно методы Bus::dispatchSync и dispatch_sync.

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

Middleware Псевдоним

Свойство $routeMiddleware класса App\Http\Kernel было переименовано в $middlewareAliases, чтобы лучше отражать его назначение. Вы можете переименовать это свойство в существующих приложениях, но это не обязательное требование.

Возвращаемые значения ограничителя скорости

При вызове метода RateLimiter::attempt значение, возвращаемое замыканием, теперь будет возвращено и методом. Если замыкание ничего не возвращает или возвращает null, то метод вернет true:

$value = RateLimiter::attempt('key', 10, fn () => ['example'], 1);

$value; // ['example']

Метод Redirect::home

Устаревший метод Redirect::home был удален. Вместо этого ваше приложение должно редиректить на явно указанный маршрут:

return Redirect::route('home');

Тестирование

Имитация сервиса

Устаревший трейт MocksApplicationServices был удален из фреймворка. Он предоставлял такие методы тестирования, как expectsEvents, expectsJobs и expectsNotifications.

Если ваше приложение использует эти методы, то мы рекомендуем вам перейти на Event::fake, Bus::fake и Notification::fake, соответственно.

Валидация

Сообщения правил валидации с замыканиями

При написании кастомных правил проверки на основе замыкания, вызов колбэка $fail более одного раза теперь будет добавлять сообщения в массив, а не перезаписывать предыдущее сообщение. Это не должно повлиять на ваше приложение.

Кроме того, колбэк $fail теперь возвращает объект. Если вы ранее указывали тип возвращаемого типа, то скорей всего вам нужно обновить ваш тайпхинт:

public function rules()
{
    'name' => [
        function ($attribute, $value, $fail) {
            $fail('validation.translation.key')->translate();
        },
    ],
}

Разное

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

Автор: Laravel
Перевод: Алексей Широков

Наш Телеграм-канал — следите за новостями о Laravel.