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

Источник: «Upgrade Guide»
Перевод официального руководства по обновлению с Laravel 9 до Laravel 10. Примерное время обновления 10 минут.

Обновление до Laravel 10.0 c 9.x

Примерное время обновления: 10 минут.

Примечание. Мы пытаемся задокументировать все возможные критические изменения. Поскольку некоторые из них находятся в малоизвестных частях фреймворка, только часть этих изменений может реально повлиять на ваше приложение. Хотите сэкономить время? Вы можете использовать Laravel Shift для автоматизации обновления приложения.

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

Вероятность воздействия: Высокая

Требуется PHP 8.1.0

Теперь для Laravel требуется PHP 8.1.0 или выше.

Зависимости Composer

Вы должны обновить следующие зависимости в файле composer.json вашего приложения:

Опционально, если хотите использовать PHPUnit 10, вы должны удалить атрибут processUncoveredFiles из секции <coverage> файла phpunit.xml вашего приложения. Затем, обновите следующие зависимости в файле composer.json вашего приложения:

Наконец, проверьте любые другие сторонние пакеты, используемые в вашем приложении, и убедитесь, что вы используете правильную версию для поддержки Laravel 10.

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

Вы должны обновить параметр minimum-stability в файле composer.json вашего приложения на stable:

"minimum-stability": "stable",

Кэш / Cache

Redis тэги кэша

Вероятность воздействия: Средняя

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

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

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

База данных / Database

Database Expressions

Вероятность воздействия: Средняя

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

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

use Illuminate\Support\Facades\DB;

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

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

Query Exception Constructor

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

Конструктор 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.

Локализация / Localization

Каталог Языков

Вероятность воздействия: Отсутствует

Хотя это и не относится к существующим приложениям, скелет приложения Laravel больше не содержит каталог lang по умолчанию. Вместо этого при написании новых приложений Laravel их можно опубликовать с помощью команды artisan lang:publish:

php artisan lang:publish

Логирование / Logging

Monolog 3

Вероятность воздействия: Низкая

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

Очереди / Queues

Метод Bus::dispatchNow

Вероятность воздействия: Низкая

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

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

Алиасы Middleware / Middleware Aliases

Вероятность воздействия: Опционально

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

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

Вероятность воздействия: Низкая

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

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

$value; // ['example']

Метод Redirect::home

Вероятность воздействия: Очень Низкая

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

return Redirect::route('home');

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

Фиктивные Сервисы / Service Mocking

Вероятность воздействия: Средняя

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

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

Валидация / Validation

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

Вероятность воздействия: Очень Низкая

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

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

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

Разное

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

Вы можете посмотреть изменения с помощью инструмента сравнения GitHub и выбрать, какие обновления для вас важны. Однако многие изменения, показанные инструментом сравнения GitHub, связаны с принятием нашей организацией нативных типов PHP. Эти изменения обратно совместимы, и их принятие во время миграции на Laravel 10 необязательно.

Дополнительные материалы

Предыдущая Статья

JavaScript: Новое событие scrollend

Следующая Статья

JavaScript: Руководство по localStorage