Любите загадки? Событие еще доступно на сайте.
Поделитесь своим кодом и идеями!
Поделитесь своим кодом и идеями!

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

Вы просматриваете документ для прошлой версии.
Рассмотрите возможность обновления вашего проекта до актуальной версии 11.x. Почему это важно?

Изменения, оказывающие большое влияние

Изменения со средней степенью воздействия

Изменения с низким уровнем воздействия

Обновление с 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:

Если вы обновляете Sanctum с 2.x до 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

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

Использование 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 является необязательным.