Руководство по обновлению
Изменения, оказывающие большое влияние
Изменения, оказывающие среднее влияние
Обновление до 8.0 с 7.x
Приблизительное время обновления: 15 минут
{note} Мы стараемся задокументировать все возможные критические изменения. Поскольку некоторые из этих критических изменений находятся в малоизвестных частях фреймворка, только часть этих изменений может повлиять на Ваше приложение.
Требуется PHP 7.3.0
Вероятность воздействия: средняя
Новая минимальная версия PHP теперь 7.3.0.
Обновление зависимостей
Обновите следующие зависимости в Вашем файле composer.json
:
-
guzzlehttp/guzzle
на^7.0.1
-
facade/ignition
на^2.3.6
-
laravel/framework
на^8.0
-
laravel/ui
на^3.0
-
nunomaduro/collision
на^5.0
-
phpunit/phpunit
на^9.0
Следующие основные пакеты имеют новые основные выпуски для поддержки Laravel 8. Если возможно, Вы должны прочитать соответствующие руководства по обновлению перед обновлением:
Кроме того, установщик Laravel был обновлен для поддержки composer create-project
и Laravel Jetstream. Любой установщик старше 4.0 перестанет работать после октября 2020 года. Вам следует как можно скорее обновить глобальный установщик до ^4.0
.
Наконец, изучите любые другие сторонние пакеты, используемые Вашим приложением, и убедитесь, что Вы используете правильную версию для поддержки Laravel 8.
Коллекции
Метод isset
Вероятность воздействия: Низкая
Чтобы соответствовать типичному поведению PHP, метод offsetExists
в Illuminate\Support\Collection
был обновлен и теперь использует isset
вместо array_key_exists
. Это может привести к изменению поведения при работе с элементами коллекции, имеющими значение null
:
$collection = collect([null]); // Laravel 7.x - trueisset($collection[0]); // Laravel 8.x - falseisset($collection[0]);
База данных
Пространства имен Сидов и Фабрик
Вероятность воздействия: Высокая
Сиды и фабрики теперь имеют пространство имен. Чтобы учесть эти изменения, добавьте пространство имен Database\Seeders
в Ваши классы сидов. Кроме того, предыдущий каталог database/seeds
должен быть переименован в database/seeders
:
<?php namespace Database\Seeders; use App\Models\User;use Illuminate\Database\Seeder; class DatabaseSeeder extends Seeder{ /** * Seed the application's database. * * @return void */ public function run() { ... }}
Если Вы решили использовать пакет laravel/legacy-factories
, никаких изменений в Ваших фабричных классах не требуется. Однако, если Вы обновляете свои фабрики, Вы должны добавить к этим классам пространство имен Database\Factories
.
Затем в Вашем файле composer.json
удалите блок classmap
из раздела autoload
и добавьте новые сопоставления каталогов классов с пространством имен:
"autoload": { "psr-4": { "App\\": "app/", "Database\\Factories\\": "database/factories/", "Database\\Seeders\\": "database/seeders/" }},
Eloquent
Модель Фабрик
Вероятность воздействия: Высокая
Функция Laravel фабрики моделей была полностью переписана для поддержки классов и несовместима с фабриками стиля Laravel 7.x. Однако, чтобы упростить процесс обновления, был создан новый пакет laravel/legacy-factories
для продолжения использования ваших существующих фабрик с Laravel 8.x. Вы можете установить этот пакет через Composer:
composer require laravel/legacy-factories
Интерфейс Castable
Вероятность воздействия: Низкая
Метод castUsing
интерфейса Castable
был обновлен, чтобы принимать массив аргументов. Если Вы реализуете этот интерфейс, Вам следует соответствующим образом обновить свою реализацию:
public static function castUsing(array $arguments);
События увеличения / уменьшения
Вероятность воздействия: Низкая
Соответствующие события модели, связанные с «обновлением» и «сохранением», теперь будут отправляться при выполнении методов increment
или decrement
на экземплярах модели Eloquent.
События
The EventServiceProvider
Class
Вероятность воздействия: Низкая
Если ваш класс App\Providers\EventServiceProvider
содержит функцию register
, вы должны убедиться, что вы вызываете parent::register
в начале этого метода. В противном случае события вашего приложения не будут зарегистрированы.
Контракт Dispatcher
Вероятность воздействия: Низкая
Метод listen
контракта Illuminate\Contracts\Events\Dispatcher
был обновлен, чтобы сделать свойство $listener
необязательным. Это изменение было внесено для поддержки автоматического определения обрабатываемых типов событий через отражение. Если Вы реализуете этот интерфейс вручную, Вам следует соответствующим образом обновить свою реализацию:
public function listen($events, $listener = null);
Фреймворк
Обновления режима обслуживания
Вероятность воздействия: Необязательная
Функция режим обслуживания Laravel была улучшена в Laravel 8.x. Теперь поддерживается предварительная визуализация шаблона режима обслуживания, что исключает вероятность того, что конечные пользователи столкнутся с ошибками в режиме обслуживания. Однако для поддержки этого в Ваш файл public/index.php
необходимо добавить следующие строки. Эти строки следует разместить непосредственно под существующим определением константы LARAVEL_START
:
define('LARAVEL_START', microtime(true)); if (file_exists(__DIR__.'/../storage/framework/maintenance.php')) { require __DIR__.'/../storage/framework/maintenance.php';}
Параметр php artisan down --message
Вероятность воздействия: Средняя
Опция --message
команды php artisan down
была удалена. В качестве альтернативы рассмотрите возможность предварительной обработки представлений в режиме обслуживания с выбранным Вами сообщением.
Параметр php artisan serve --no-reload
Вероятность воздействия: Низкая
В команду php artisan serve
добавлен параметр --no-reload
. Это даст указание встроенному серверу не перезагружать сервер при обнаружении изменений файла среды. Эта опция в первую очередь полезна при запуске тестов Laravel Dusk в среде CI.
Свойство менеджера $app
Вероятность воздействия: Низкая
Ранее устаревшее свойство $app
класса Illuminate\Support\Manager
было удалено. Если Вы полагались на это свойство, Вам следует использовать вместо него свойство $container
.
Помощник elixir
Вероятность воздействия: Низкая
Ранее устаревший помощник elixir
был удален. Приложениям, все еще использующим этот метод, рекомендуется перейти на Laravel Mix.
Почта
Метод sendNow
Вероятность воздействия: Низкая
Ранее устаревший метод sendNow
был удален. Вместо этого используйте метод send
.
Пагинация
Пагинация по умолчанию
Вероятность воздействия: Высокая
Пагинатор теперь использует CSS-фреймворк Tailwind для своего стиля по умолчанию. Чтобы продолжать использовать Bootstrap, Вы должны добавить следующий вызов метода к методу boot
Вашего приложения AppServiceProvider
:
use Illuminate\Pagination\Paginator; Paginator::useBootstrap();
Очередь
Метод retryAfter
Вероятность воздействия: Высокая
Для согласованности с другими функциями Laravel метод retryAfter
и свойство retryAfter
заданий в очереди, почтовых программ, уведомлений и слушателей были переименованы в backoff
. Вам следует обновить имя этого метода / свойства в соответствующих классах вашего приложения.
Свойство timeoutAt
Вероятность воздействия: Высокая
Свойство timeoutAt
заданий в очереди, уведомлений и слушателей переименовано в retryUntil
. Вам следует обновить имя этого свойства в соответствующих классах Вашего приложения.
Методы allOnQueue()
/ allOnConnection()
Вероятность воздействия: Высокая
Для согласованности с другими методами диспетчеризации были удалены методы allOnQueue()
и allOnConnection()
, используемые с цепочкой заданий. Вместо этого Вы можете использовать методы onQueue()
и onConnection()
. Эти методы следует вызывать перед вызовом метода dispatch
:
ProcessPodcast::withChain([ new OptimizePodcast, new ReleasePodcast])->onConnection('redis')->onQueue('podcasts')->dispatch();
Обратите внимание, что это изменение влияет только на код, использующий метод withChain
. allOnQueue()
и allOnConnection()
по-прежнему доступны при использовании глобального помощника dispatch()
.
Пакетная поддержка таблицы невыполненных заданий
Вероятность воздействия: Необязательная
Если Вы планируете использовать функции пакетирование заданий Laravel 8.x, Ваша таблица базы данных failed_jobs
должна быть обновлена. Во-первых, в Вашу таблицу должен быть добавлен новый столбец uuid
:
use Illuminate\Database\Schema\Blueprint;use Illuminate\Support\Facades\Schema; Schema::table('failed_jobs', function (Blueprint $table) { $table->string('uuid')->after('id')->nullable()->unique();});
Затем параметр конфигурации failed.driver
в Вашем конфигурационном файле queue
должен быть обновлен до database-uuids
.
Кроме того, Вы можете создать UUID для существующих неудачных заданий:
DB::table('failed_jobs')->whereNull('uuid')->cursor()->each(function ($job) { DB::table('failed_jobs') ->where('id', $job->id) ->update(['uuid' => (string) Illuminate\Support\Str::uuid()]);});
Маршрутизация
Автоматическое префикс пространства имен контроллера
Вероятность воздействия: Необязательная
В предыдущих выпусках Laravel класс RouteServiceProvider
содержал свойство $namespace
со значением App\Http\Controllers
. Значение этого свойства использовалось для автоматического префикса объявлений маршрута контроллера и генерации URL маршрута контроллера, например, при вызове помощника action
.
В Laravel 8 для этого свойства по умолчанию установлено значение null
. Это позволяет объявлениям маршрутов Вашего контроллера использовать стандартный вызываемый синтаксис PHP, который обеспечивает лучшую поддержку перехода к классу контроллера во многих IDE:
use App\Http\Controllers\UserController; // Использование вызываемого синтаксиса PHP...Route::get('/users', [UserController::class, 'index']); // Использование строкового синтаксиса...Route::get('/users', 'App\Http\Controllers\UserController@index');
В большинстве случаев это не повлияет на приложения, которые обновляются, потому что ваш RouteServiceProvider
по-прежнему будет содержать свойство $namespace
с его предыдущим значением. Однако, если вы обновите свое приложение, создав новый проект Laravel, вы можете столкнуться с этим как критическое изменение.
Если Вы хотите продолжить использование исходной маршрутизации контроллера с автоматическим префиксом, Вы можете просто установить значение свойства $namespace
в своем RouteServiceProvider
и обновить регистрации маршрута в методе boot
, чтобы использовать свойство пространства имен $namespace
:
class RouteServiceProvider extends ServiceProvider{ /** * The path to the "home" route for your application. * * This is used by Laravel authentication to redirect users after login. * * @var string */ public const HOME = '/home'; /** * If specified, this namespace is automatically applied to your controller routes. * * In addition, it is set as the URL generator's root namespace. * * @var string */ protected $namespace = 'App\Http\Controllers'; /** * Define your route model bindings, pattern filters, etc. * * @return void */ public function boot() { $this->configureRateLimiting(); $this->routes(function () { Route::middleware('web') ->namespace($this->namespace) ->group(base_path('routes/web.php')); Route::prefix('api') ->middleware('api') ->namespace($this->namespace) ->group(base_path('routes/api.php')); }); } /** * Configure the rate limiters for the application. * * @return void */ protected function configureRateLimiting() { RateLimiter::for('api', function (Request $request) { return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip()); }); }}
Планирование
Библиотека cron-expression
Вероятность воздействия: Низкая
Зависимость Laravel от dragonmantank/cron-expression
была обновлена с 2.x
до 3.x
. Это не должно вызывать каких-либо критических изменений в Вашем приложении, если Вы не взаимодействуете напрямую с библиотекой cron-expression
. Если Вы напрямую взаимодействуете с этой библиотекой, просмотрите ее журнал изменений.
Сессия
Контракт Session
Вероятность воздействия: Низкая
Контракт Illuminate\Contracts\Session\Session
получил новый метод pull
. Если Вы реализуете этот контракт вручную, Вам следует соответствующим образом обновить свою реализацию
/** * Get the value of a given key and then forget it. * * @param string $key * @param mixed $default * @return mixed */public function pull($key, $default = null);
Тестирование
Метод decodeResponseJson
Вероятность воздействия: Низкая
Метод decodeResponseJson
, принадлежащий классу Illuminate\Testing\TestResponse
, больше не принимает никаких аргументов. Пожалуйста, подумайте об использовании вместо этого метода json
.
Метод assertExactJson
Вероятность воздействия: Средняя
Метод assertExactJson
теперь требует, чтобы числовые ключи сравниваемых массивов совпадали и располагались в том же порядке. Если Вы хотите сравнить JSON с массивом, не требуя, чтобы массивы с числовыми ключами имели одинаковый порядок, Вы можете вместо этого использовать метод assertSimilarJson
.
Валидация
Правила подключения базы данных
Вероятность воздействия: Низкая
Правила unique
и exists
теперь будут учитывать указанное имя соединения (доступное через метод getConnectionName
модели) моделей Eloquent при выполнении запросов.
Разное
Мы также рекомендуем вам просматривать изменения в laravel/laravel
репозиторий GitHub. Хотя многие из этих изменений не требуются, вы можете захотеть синхронизировать эти файлы с вашим приложением. Некоторые из этих изменений будут рассмотрены в этом руководстве по обновлению, но другие, такие как изменения файлов конфигурации или комментарии, не будут. Вы можете легко просмотреть изменения с помощью инструмента сравнения GitHub и выбрать, какие обновления важны для вас.