1. Введение
  2. Руководство по Обновлению

Присоединяйся к нашему Telegram сообществу @webblend!

Здесь ты найдешь сниппеты по Laravel и полезные советы по веб-разработке.

Изменения Высокой Сложности

Изменения Средней Сложности

Изменения Низкой Сложности

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

Предполагаемое Время Обновления: 10 Минут

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

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

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

Требуется PHP 8.1.0

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

Требуется Composer 2.2.0

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

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

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

  • laravel/framework to ^10.0
  • laravel/sanctum to ^3.2
  • doctrine/dbal to ^3.0
  • spatie/laravel-ignition to ^2.0
  • laravel/passport to ^11.0 (Upgrade Guide)

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

Кроме того, если вы хотите использовать 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, вы можете удалить эту настройку из файла composer.json вашего приложения:

"minimum-stability": "stable",

Приложение

Привязка Публичного Пути

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

Если ваше приложение настраивает "публичный путь", привязывая path.public в контейнер, вам следует обновить свой код, вызывая метод usePublicPath, предоставленный объектом Illuminate\Foundation\Application:

app()->usePublicPath(__DIR__.'/public');

Авторизация

Метод registerPolicies

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

Метод registerPolicies в AuthServiceProvider теперь вызывается автоматически фреймворком. Следовательно, вы можете удалить вызов этого метода из метода boot вашего AuthServiceProvider приложения.

Кэш

Теги Кэша Redis

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

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

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

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

База данных

Выражения Базы Данных

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

База данных "выражений" (обычно создаваемых через 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());

Конструктор Исключений Запроса

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

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

Колонки ULID

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

При вызове метода ulid в миграциях без аргументов, теперь столбец будет называться ulid. В предыдущих версиях Laravel, вызов этого метода без аргументов создавал столбец с ошибочным именем uuid:

$table->ulid();

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

$table->ulid('ulid');

Eloquent

Свойство Модели "Dates"

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

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

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

Локализация

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

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

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

php artisan lang:publish

Журналирование

Monolog 3

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

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

Если вы используете сторонние службы регистрации ошибок, такие как BugSnag или Rollbar, вам может потребоваться обновить эти сторонние пакеты до версии, поддерживающей Monolog 3.x и Laravel 10.x.

Очереди

Метод Bus::dispatchNow

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

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

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

Псевдонимы Промежуточного ПО

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

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

Возвращаемые Значения Rate Limiter

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

При вызове метода RateLimiter::attempt значение, возвращенное предоставленным замыканием, теперь будет возвращено методом. Если ничего или null не возвращается, метод attempt вернет 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();
},
],
}

После Метода Form Request

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

В рамках форм-запросов метод after теперь зарезервирован Laravel. Если ваши форм-запросы определяют метод after, этот метод следует переименовать или изменить для использования новой функции "после валидации" форм-запросов Laravel.

Разное

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

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