Laravel 11: Руководство по обновлению
Изменения с высоким уровнем влияния
- Обновление зависимостей
- Структура приложения
- Типы с плавающей точкой
- Модификация столбцов
- Минимальная версия SQLite 3.35.0+
- Обновление Sanctum
Изменения со средним уровнем влияния
Изменения с низким уровнем влияния
- Удаление DBAL доктрины
- Модель Eloquent метод
casts
- Пространственные типы
- Пакет Spatie Once
- Контракт
Enumerable
- Контракт
UserProvider
- Контракт
Authenticatable
Мы стараемся документировать все изменения. Некоторые изменения находятся в малоизвестных частях фреймворка, лишь часть из них может повлиять на ваше приложение
Обновление до версии 11.0 с версии 10.x
Примерное время обновления: 15 минут
Обновление зависимостей
Вероятность влияния: Высокая
Требуется PHP 8.2.0
Laravel 11 требует PHP 8.2.0 или более поздней версии.
Зависимости Composer
Необходимо обновить следующие зависимости в файле composer.json
вашего приложения:
laravel/framework
to^11.0
nunomaduro/collision
to^8.1
laravel/breeze
to^2.0
(если установлен)laravel/cashier
to^15.0
(если установлен)laravel/dusk
to^8.0
(если установлен)laravel/jetstream
to^5.0
(если установлен)laravel/passport
to^12.0
(если установлен)laravel/sanctum
to^4.0
(если установлен)laravel/spark-stripe
to^5.0
(если установлен)laravel/telescope
to^5.0
(если установлен)inertiajs/inertia-laravel
to^1.0
(если установлен)
Если приложение использует Laravel Cashier Stripe, Passport, Sanctum, Spark Stripe или Telescope, вам нужно опубликовать их миграции в своём приложении. Cashier Stripe, Passport, Sanctum, Spark Stripe и Telescope больше не загружают миграции автоматически из собственного каталога migrations
. Поэтому для публикации их миграций в приложении необходимо выполнить следующую команду:
php artisan vendor:publish --tag=cashier-migrations
php artisan vendor:publish --tag=passport-migrations
php artisan vendor:publish --tag=sanctum-migrations
php artisan vendor:publish --tag=spark-migrations
php artisan vendor:publish --tag=telescope-migrations
Кроме того, необходимо просмотреть руководства по обновлению для каждого из этих пакетов, чтобы убедиться, что вы знаете обо всех дополнительных изменениях:
Если вы установили инсталлятор Laravel вручную, необходимо обновить его через Composer:
composer global require laravel/installer:^5.6
Кроме того, можно удалить зависимость Composer doctrine/dbal
, если ранее она была добавлена в приложение, поскольку Laravel больше не зависит от этого пакета.
Структура приложения
Вероятность влияния: Высокая
Laravel 11 представляет новую структуру приложения по умолчанию с меньшим количеством файлов. А именно, новые приложения Laravel содержат меньше сервис-провайдеров, middleware и конфигурационных файлов.
Однако мы не рекомендуем приложениям Laravel 10, обновляющимся до Laravel 11, пытаться изменить структуру приложения, поскольку Laravel 11 был тщательно настроен для поддержки структуры приложений Laravel 10.
Аутентификация
Перехеширование паролей
Вероятность влияния: Средняя
Laravel 11 автоматически перехеширует пароли пользователей при аутентификации, если "коэффициента работы" алгоритма хеширования был обновлён с момента последнего хеширования пароля.
Обычно это не мешает работе приложения; однако можно отключить это поведение, добавив опцию rehash_on_login
в конфигурационный файл config/hashing.php
приложения:
'rehash_on_login' => false,
Контракт UserProvider
Вероятность влияния: Низкая
Контракт Illuminate\Contracts\Auth\UserProvider
получил новый метод rehashPasswordIfRequired
. Этот метод отвечает за повторное хэширование и сохранение пароля пользователя в хранилище при изменении коэффициента работы алгоритма хэширования.
Если приложение или пакет определяют класс, реализующий этот интерфейс, необходимо добавить новый метод rehashPasswordIfRequired
в его реализацию. Эталонную реализацию можно найти в классе Illuminate\Auth\EloquentUserProvider
:
public function rehashPasswordIfRequired(Authenticatable $user, array $credentials, bool $force = false);
Контракт Authenticatable
Вероятность влияния: Низкая
Контракт Illuminate\Contracts\Auth\Authenticatable
получил новый метод getAuthPasswordName
. Этот метод отвечает за возврат имени колонки паролей вашей аутентифицируемой сущности.
Если в приложении или пакете определён класс, реализующий этот интерфейс, необходимо добавить новый метод getAuthPasswordName
в его реализацию:
public function getAuthPasswordName()
{
return 'password';
}
Модель User
по умолчанию, входящая в состав Laravel, получает этот метод автоматически, поскольку он включён в трейт Illuminate\Auth\Authenticatable
.
Кэш
Префиксы ключей кэша
Вероятность влияния: Низкая
Ранее, если префикс ключа кэша был определён для кэш-хранилищ DynamoDB, Memcached или Redis, Laravel добавлял к префиксу :
. В Laravel 11 префикс ключа кэша не получает суффикс :
. Если вы хотите сохранить прежнее поведение префикса, вы можете вручную добавить суффикс :
к префиксу ключа кэша.
Коллекции
Контракт Enumerable
Вероятность влияния: Низкая
Обновлён метод dump
контракта Illuminate\Support\Enumerable
, теперь он принимает переменный аргумент ...$args
. Если вы реализуете этот интерфейс, необходимо соответствующим образом обновить свою реализацию:
public function dump(...$args);
База данных
SQLite 3.35.0+
Вероятность влияния: Высокая
Если приложение использует базу данных SQLite, требуется версия SQLite 3.35.0 или выше.
Модель Eloquent метод casts
Вероятность влияния: Низкая
Базовый класс модели Eloquent теперь определяет метод casts
для поддержки определения каста атрибутов. Если одна из моделей приложения определяет отношение casts
, оно может конфликтовать с методом casts
, присутствующим в базовом классе модели Eloquent.
Модификация столбцов
Вероятность влияния: Высокая
При изменении столбца теперь необходимо явно указать все модификаторы, которые необходимо сохранить в определении столбца после его изменения. Все отсутствующие атрибуты будут удалены. Например, чтобы сохранить атрибуты unsigned
, default
и comment
, необходимо явно вызвать каждый модификатор при изменении столбца, даже если эти атрибуты были назначены столбцу при предыдущей миграции.
Например, представьте, что у вас есть миграция, создающая столбец votes
с атрибутами unsigned
, default
и comment
:
Schema::create('users', function (Blueprint $table) {
$table->integer('votes')->unsigned()->default(1)->comment('The vote count');
});
Позже вы написали миграцию, изменяющую столбец на nullable
:
Schema::table('users', function (Blueprint $table) {
$table->integer('votes')->nullable()->change();
});
В Laravel 10 при миграции сохранялись атрибуты unsigned
, default
и comment
для столбца. Однако в Laravel 11 миграция должна также включать все атрибуты, определённые ранее для столбца. В противном случае они будут удалены:
Schema::table('users', function (Blueprint $table) {
$table->integer('votes')
->unsigned()
->default(1)
->comment('The vote count')
->nullable()
->change();
});
Метод change
не изменяет индексы столбца. Поэтому для явного добавления или удаления индекса при изменении столбца можно использовать модификаторы индекса:
// Добавляем индекс...
$table->bigIncrements('id')->primary()->change();
// Удаляем индекс...
$table->char('postal_code', 10)->unique(false)->change();
Если вы не хотите обновлять все существующие миграции "change" в приложении, для сохранения существующих атрибутов столбца, можно просто "сжать" миграции:
php artisan schema:dump
После того как миграции будут "сжаты", Laravel "перенесёт" базу данных, используя файл схемы приложения, прежде чем запустить оставшиеся миграции.
Типы с плавающей точкой
Вероятность влияния: Высокая
Типы столбцов миграции double
и float
были переписаны, для согласованности во всех базах данных.
Тип столбца double
теперь создаёт эквивалентный столбец DOUBLE
без общего количества цифр и мест (цифр после десятичной точки), что является стандартным синтаксисом SQL. Поэтому вы можете удалить аргументы $total
и $places
:
$table->double('amount');
Тип столбца float
создаёт столбец, эквивалентный FLOAT
, без общего количества цифр и мест (цифр после запятой), но с необязательной спецификацией $precision
для определения размера хранения в виде 4-байтного столбца с одинарной точностью или 8-байтного столбца с двойной точностью. Поэтому вы можете удалить аргументы $total
и $places
и указать необязательное значение $precision
в соответствии с документацией вашей базы данных:
$table->float('amount', precision: 53);
Методы unsignedDecimal
, unsignedDouble
и unsignedFloat
были удалены, поскольку модификатор unsigned
для этих типов столбцов устарел в MySQL и никогда не был стандартизирован в других системах баз данных. Однако, если вы хотите продолжать использовать устаревший атрибут unsigned
, вы можете добавить метод unsigned
в определение столбца:
$table->decimal('amount', total: 8, places: 2)->unsigned();
$table->double('amount')->unsigned();
$table->float('amount', precision: 53)->unsigned();
Отдельный драйвер MariaDB
Вероятность влияния: Низкая
Вместо использования драйвера MySQL при подключении к базам данных MariaDB, Laravel 11 добавляет отдельный драйвер базы данных для MariaDB.
Если ваше приложение подключается к базе данных MariaDB, можно обновить конфигурацию подключения на новый драйвер mariadb
, чтобы в будущем воспользоваться возможностями, специфичными для MariaDB:
'driver' => 'mariadb',
'url' => env('DB_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
// ...
В настоящее время новый драйвер MariaDB ведёт себя так же, как и текущий драйвер MySQL, за одним исключением: метод построения схемы uuid
создаёт собственные столбцы UUID
вместо столбцов char(36)
.
Если ваши существующие миграции используют метод uuid
для построения схемы, а вы решили использовать новый драйвер базы данных mariadb
, необходимо обновить вызовы метода uuid
в миграции до char
, чтобы избежать изменений или неожиданного поведения:
Schema::table('users', function (Blueprint $table) {
$table->char('uuid', 36);
// ...
});
Пространственные типы
Вероятность влияния: Низкая
Типы пространственных столбцов в миграциях баз данных были переписаны таким образом, чтобы быть согласованными во всех базах данных. Поэтому можно удалить из миграций методы point
, lineString
, polygon
, geometryCollection
, multiPoint
, multiLineString
, multiPolygon
и multiPolygonZ
и использовать вместо них методы geometry
или geography
:
$table->geometry('shapes');
$table->geography('coordinates');
Для явного ограничения типа или идентификатора пространственной системы ссылок для значений, хранящихся в столбце на MySQL, MariaDB и PostgreSQL, вы можете передать методу subtype
и srid
:
$table->geometry('dimension', subtype: 'polygon', srid: 0);
$table->geography('latitude', subtype: 'point', srid: 4326);
Соответственно, модификаторы столбца isGeometry
и projection
в грамматике PostgreSQL были удалены.
Удаление DBAL доктрины
Вероятность влияния: Низкая
Следующий список классов и методов, связанных с Doctrine DBAL, был удалён. Laravel больше не зависит от этого пакета, и регистрация пользовательских типов Doctrines больше не требуется для правильного создания и изменения различных типов колонок, которые ранее требовали:
Illuminate\Database\Schema\Builder::$alwaysUsesNativeSchemaOperationsIfPossible
свойство классаIlluminate\Database\Schema\Builder::useNativeSchemaOperationsIfPossible()
methodIlluminate\Database\Connection::usingNativeSchemaOperations()
методIlluminate\Database\Connection::isDoctrineAvailable()
методIlluminate\Database\Connection::getDoctrineConnection()
методIlluminate\Database\Connection::getDoctrineSchemaManager()
методIlluminate\Database\Connection::getDoctrineColumn()
методIlluminate\Database\Connection::registerDoctrineType()
методIlluminate\Database\DatabaseManager::registerDoctrineType()
методIlluminate\Database\PDO
директорияIlluminate\Database\DBAL\TimestampType
классIlluminate\Database\Schema\Grammars\ChangeColumn
классIlluminate\Database\Schema\Grammars\RenameColumn
классIlluminate\Database\Schema\Grammars\Grammar::getDoctrineTableDiff()
метод
Кроме того, больше не требуется регистрировать пользовательские типы Doctrine через dbal.types
в файле конфигурации database
приложения.
Если вы ранее использовали Doctrine DBAL для проверки базы данных и связанных с ней таблиц, то вместо этого можно использовать новые методы нативной схемы Laravel (Schema::getTables()
, Schema::getColumns()
, Schema::getIndexes()
, Schema::getForeignKeys()
и т. д.).
Устаревшие методы схемы
Вероятность влияния: Очень низкая
Устаревшие методы Schema::getAllTables()
, Schema::getAllViews()
и Schema::getAllTypes()
, основанные на Doctrine, были удалены в пользу новых нативных методов Laravel — Schema::getTables()
, Schema::getViews()
и Schema::getTypes()
.
При использовании PostgreSQL и SQL Server ни один из новых методов схемы не примет трёхкомпонентную ссылку (например, database.schema.table
). Поэтому для объявления базы данных следует использовать connection()
:
Schema::connection('database')->hasTable('schema.table');
Метод getColumnType()
построителя схемы
Вероятность влияния: Очень низкая
Метод Schema::getColumnType()
теперь всегда возвращает фактический тип заданного столбца, а не тип, эквивалентный типу Doctrine DBAL.
Интерфейс подключения к базе данных
Вероятность влияния: Очень низкая
Интерфейс Illuminate\Database\ConnectionInterface
получил новый метод scalar
. Если вы определяете собственную реализацию этого интерфейса, необходимо добавить метод scalar
в реализацию:
public function scalar($query, $bindings = [], $useReadPdo = true);
Даты
Carbon 3
Вероятность влияния: Средняя
Laravel 11 поддерживает Carbon 2 и Carbon 3. Carbon — это библиотека для работы с датами, широко используемая в Laravel и пакетах по всей экосистеме. Если устанавливаете Carbon 3, вам следует просмотреть change log Carbon.
Почта
Контракт Mailer
Вероятность влияния: Очень низкая
Контракт Illuminate\Contracts\Mail\Mailer
получил новый метод sendNow
. Если приложение или пакет реализует этот контракт вручную, необходимо добавить новый метод sendNow
в реализацию:
public function sendNow($mailable, array $data = [], $callback = null);
Пакеты
Публикация сервис-провайдеров в приложении
Вероятность влияния: Очень низкая
Если вы создали пакет Laravel, вручную публикующий сервис-провайдера в каталоге приложения app/Providers
и вручную изменяющий конфигурационный файл config/app.php
для регистрации сервис-провайдера, необходимо обновить пакет, чтобы он использовал новый метод ServiceProvider::addProviderToBootstrapFile
.
Метод addProviderToBootstrapFile
автоматически добавит опубликованного провайдера в файл приложения bootstrap/providers.php
, поскольку массив providers не существует в файле конфигурации config/app.php
в новых приложениях Laravel 11.
use Illuminate\Support\ServiceProvider;
ServiceProvider::addProviderToBootstrapFile(Provider::class);
Очереди
Интерфейс BatchRepository
Вероятность влияния: Очень низкая
Интерфейс Illuminate\Bus\BatchRepository
получил новый метод rollBack
. Если вы реализуете этот интерфейс в своём пакете или приложении, необходимо добавить этот метод в вашу реализацию:
public function rollBack();
Синхронные задания в транзакциях базы данных
Вероятность влияния: Очень низкая
Ранее синхронные задания (задания, использующие драйвер очереди sync
) выполнялись немедленно, независимо от того, был ли параметр конфигурации after_commit
соединения очереди установлен в true
или для задания был вызван метод afterCommit
.
В Laravel 11 синхронные задания очереди теперь будут учитывать конфигурацию "после коммита" соединения очереди или задания.
Ограничение соединений
Посекундное ограничение соединений
Вероятность влияния: Средняя
Laravel 11 поддерживает посекундное ограничение соединений вместо поминутного. С этим изменением связан целый ряд потенциальных сбоев, о которых следует знать.
Конструктор класса GlobalLimit
теперь принимает секунды вместо минут. Этот класс не документирован и обычно не используется в приложениях:
new GlobalLimit($attempts, 2 * 60);
Конструктор класса Limit
теперь принимает секунды вместо минут. Все документированные случаи использования этого класса ограничиваются статическими конструкторами, такими как Limit::perMinute
и Limit::perSecond
. Однако, если вы создаёте экземпляр класса вручную, необходимо обновить приложение, чтобы в конструктор класса передавались секунды:
new Limit($key, $attempts, 2 * 60);
Свойство decayMinutes
класса Limit
было переименовано в decaySeconds
и теперь содержит секунды вместо минут.
Конструкторы классов Illuminate\Queue\Middleware\ThrottlesExceptions
и Illuminate\Queue\Middleware\ThrottlesExceptionsWithRedis
теперь принимают секунды вместо минут:
new ThrottlesExceptions($attempts, 2 * 60);
new ThrottlesExceptionsWithRedis($attempts, 2 * 60);
Cashier Stripe
Обновление Cashier Stripe
Вероятность влияния: Высокая
Laravel 11 больше не поддерживает Cashier Stripe 14.x. Поэтому следует обновить зависимость Laravel Cashier Stripe для приложения до ^15.0
в файле composer.json
.
Cashier Stripe 15.0 больше не загружает миграции автоматически из собственной директории migrations
. Вместо этого необходимо выполнить следующую команду, чтобы опубликовать миграции Cashier Stripe в приложении:
php artisan vendor:publish --tag=cashier-migrations
Пожалуйста, ознакомьтесь с полным руководством по обновлению Cashier Stripe, чтобы узнать о дополнительных изменениях влияющих на совместимость.
Spark (Stripe)
Обновление Spark Stripe
Вероятность влияния: Высокая
Laravel 11 больше не поддерживает Laravel Spark Stripe 4.x. Поэтому необходимо обновить зависимость Laravel Spark Stripe для приложения до ^5.0
в файле composer.json
.
Spark Stripe 5.0 больше не загружает миграции автоматически из собственного каталога migrations
. Вместо этого необходимо выполнить следующую команду, чтобы опубликовать миграции Spark Stripe в приложении:
php artisan vendor:publish --tag=spark-migrations
Пожалуйста, ознакомьтесь с полным руководством по обновлению Spark Stripe, чтобы узнать о дополнительных изменениях влияющих на совместимость.
Passport
Обновление Passport
Вероятность влияния: Высокая
Laravel 11 больше не поддерживает Laravel Passport 11.x. Поэтому необходимо обновить зависимость Laravel Passport для приложения до ^12.0 в файле composer.json
.
Passport 12.0 больше не загружает миграции автоматически из собственного каталога migrations
. Вместо этого необходимо выполнить следующую команду, чтобы опубликовать миграции Passport в приложении:
php artisan vendor:publish --tag=passport-migrations
Кроме того, по умолчанию тип предоставления пароля отключён. Вы можете включить его, вызвав метод enablePasswordGrant
в методе boot
AppServiceProvider
приложения:
public function boot(): void
{
Passport::enablePasswordGrant();
}
Sanctum
Обновление Sanctum
Вероятность влияния: Высокая
Laravel 11 больше не поддерживает Laravel Sanctum 3.x. Поэтому необходимо обновить зависимость Laravel Sanctum для приложения до ^4.0
в файле composer.json
.
Sanctum 4.0 больше не загружает миграции автоматически из собственного каталога миграций. Вместо этого следует выполнять следующую команду для публикации миграций Sanctum в приложении:
php artisan vendor:publish --tag=sanctum-migrations
Затем в конфигурационном файле config/sanctum.php
приложения следует обновить ссылки на middleware authenticate_session
, encrypt_cookies
и validate_csrf_token
следующим образом:
'middleware' => [
'authenticate_session' => Laravel\Sanctum\Http\Middleware\AuthenticateSession::class,
'encrypt_cookies' => Illuminate\Cookie\Middleware\EncryptCookies::class,
'validate_csrf_token' => Illuminate\Foundation\Http\Middleware\ValidateCsrfToken::class,
],
Telescope
Обновление Telescope
Вероятность влияния: Высокая
Laravel 11 больше не поддерживает Laravel Telescope 4.x. Поэтому необходимо обновить зависимость Laravel Telescope для приложения до ^5.0
в файле composer.json
.
Telescope 5.0 больше не загружает миграции автоматически из собственного каталога migrations
. Вместо этого необходимо выполнить следующую команду, чтобы опубликовать миграции Telescope в приложении:
php artisan vendor:publish --tag=telescope-migrations
Пакет Spatie Once
Вероятность влияния: Средняя
Laravel 11 теперь предоставляет собственную функцию once
, чтобы гарантировать, что данное замыкание будет выполнено только один раз. Поэтому, если ваше приложение содержит зависимость от пакета spatie/once
, необходимо удалить его из файла composer.json
приложения, чтобы избежать возникновения конфликтов.
Разное
Мы также рекомендуем вам ознакомиться с изменениями в репозитории GitHub laravel/laravel. Хотя многие из этих изменений не являются обязательными, вы можете захотеть синхронизировать эти файлы с вашим приложением. Некоторые из изменений будут рассмотрены в этом руководстве по обновлению, но другие, такие как изменения конфигурационных файлов или комментариев, не будут рассмотрены. Вы можете просмотреть все изменения с помощью инструмента сравнения на GitHub и выбрать, какие обновления для вас важны.