Laravel 10: Руководство по обновлению
Обновление до Laravel 10.0 c 9.x
Примерное время обновления: 10 минут.
Примечание. Мы пытаемся задокументировать все возможные критические изменения. Поскольку некоторые из них находятся в малоизвестных частях фреймворка, только часть этих изменений может реально повлиять на ваше приложение. Хотите сэкономить время? Вы можете использовать Laravel Shift для автоматизации обновления приложения.
Обновление зависимостей
Вероятность воздействия: Высокая
Требуется PHP 8.1.0
Теперь для Laravel требуется PHP 8.1.0 или выше.
Зависимости Composer
Вы должны обновить следующие зависимости в файле composer.json
вашего приложения:
laravel/framework
на^10.0
spatie/laravel-ignition
на^2.0
Опционально, если хотите использовать PHPUnit 10, вы должны удалить атрибут processUncoveredFiles
из секции <coverage>
файла phpunit.xml
вашего приложения. Затем, обновите следующие зависимости в файле composer.json
вашего приложения:
nunomaduro/collision
to^7.0
phpunit/phpunit
to^10.0
Наконец, проверьте любые другие сторонние пакеты, используемые в вашем приложении, и убедитесь, что вы используете правильную версию для поддержки 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 необязательно.