Руководство по обновлению
12.x.
Почему это важно?
Изменения, оказывающие большое влияние
Изменения со средней степенью воздействия
- Выражения базы данных
- Свойство “Dates” модели
- Monolog 3
- Теги кэша Redis
- Сервис Mocking
- Каталог языка
Изменения с низким уровнем воздействия
- Сообщения правила валидации на основе замыкания
- Метод
afterзапроса формы - Привязка публичного пути
- Конструктор исключения запроса
- Возвращаемое значение Rate Limiter
- Метод
Redirect::home - Метод
Bus::dispatchNow - Метод
registerPolicies - ULID столбцы
Обновление с 9.x версии до 10.0
Приблизительное время обновления: 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до^10.0laravel/sanctumдо^3.2doctrine/dbalдо^3.0spatie/laravel-ignitionдо^2.0laravel/passportдо^11.0(Руководство по обновлению)laravel/uito^4.0
Если вы обновляете Sanctum с 2.x до 3.x из релиза 2.x, пожалуйста, ознакомьтесь с руководством по обновлению Sanctum.
Кроме того, если вы хотите использовать PHPUnit 10, вам следует удалить атрибут processUncoveredFiles из раздела <coverage> файла phpunit.xml. Затем обновите следующие зависимости в файле composer.json вашего приложения:
nunomaduro/collisionto^7.0phpunit/phpunitto^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
Вероятность воздействия: Средняя
Использование Cache::tags() рекомендуется только для приложений, использующих Memcached. Если вы используете Redis в качестве драйвера кэша вашего приложения, рассмотрите возможность перехода на Memcached или использование альтернативного решения.
База данных
Вероятность воздействия: Средняя
Выражения базы данных
В Laravel 10.x выражения базы данных (обычно генерируемые через DB::raw) были переписаны для предоставления дополнительной функциональности в будущем. Важно отметить, что сырое строковое значение грамматики теперь должно быть получено через метод 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" модели
Вероятность воздействия: Средняя
Устаревшее свойство $dates в Eloquent-модели было удалено. Теперь ваше приложение должно использовать свойство $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 соответственно.
Возвращаемое значение помощника dispatch()
Вероятность воздействия: Низкая
Вызов dispatch с классом, который не реализует Illuminate\Contracts\Queue, ранее возвращал результат метода handle этого класса. Однако теперь это будет возвращён экземпляр Illuminate\Foundation\Bus\PendingBatch. Вы можете использовать dispatch_sync() чтобы вернуться к предыдущему поведению.
Маршрутизация
Псевдонимы Middleware
Вероятность воздействия: Опционально
В новых приложениях 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');
Тестирование
Сервис Mocking
Вероятность воздействия: Средняя
Устаревший трейт 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();
},
],
}
Сообщения о валидации и правила на основе замыканий
Вероятность воздействия: Очень низкая
Ранее вы могли назначить сообщение об ошибке другому ключу, предоставив массив в $fail в правилах валидации на основе замыканий. Однако теперь вы должны предоставить ключ в качестве первого аргумента, а сообщение об ошибке – в качестве второго аргумента:
Validator::make([
'foo' => 'string',
'bar' => [function ($attribute, $value, $fail) {
$fail('foo', 'Something went wrong!');
}],
]);
Метод after запроса формы
Вероятность воздействия: Очень низкая
Метод after внутри запросов формы теперь зарезервирован Laravel.
Если в ваших запросах формы определён метод after, этот метод следует переименовать или изменить, чтобы использовать новую функциональность “после валидации” в запросах формы Laravel.
Разное
Мы также рекомендуем вам просматривать изменения в GitHub-репозитории laravel/laravel. Хотя многие из этих изменений могут быть неважны, но вы можете синхронизировать эти файлы с вашим приложением. Некоторые из этих изменений будут рассмотрены в данном руководстве по обновлению, но другие, такие как изменения файлов конфигурации или комментарии, не будут.
Вы можете легко просмотреть изменения с помощью инструмента сравнения GitHub и выбрать, какие обновления важны для вас. Тем не менее, многие изменения, показанные инструментом сравнения GitHub, связаны с принятием нативных типов PHP в нашей организации. Эти изменения обратно совместимы, и их принятие во время миграции на Laravel 10 является необязательным.