Инструкции по обновлению Laravel до версии 8.0 с версии 7.x
- Обновление Laravel до 8.0 с 7.x
- Изменения, оказывающие большое влияние
- Изменения со средней степенью воздействия
- Обновление Laravel до 8.0 с 7.x
Обновление Laravel до 8.0 с 7.x
Приблизительное время обновления: 15 минут
Мы стараемся задокументировать все возможные критические изменения. Поскольку некоторые из этих критических изменений находятся в малоизвестных частях фреймворка, только часть этих изменений может повлиять на ваше приложение.
Требуется 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 - истина
isset($collection[0]);
// Laravel 8.x - ложь
isset($collection[0]);
База данных
Пространства имен Seeder и Factory
Вероятность воздействия: высокая
Seeders и factories теперь имеют пространство имен. Чтобы учесть эти изменения, добавьте пространство имен Database\Seeders
в классы сидера. Кроме того, бывший ранее каталог database/seeds
следует переименовать в database/seeders
:
<?php
namespace Database\Seeders;
use App\Models\User;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Заполните базу данных приложения.
*
* @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
Model Factories
Вероятность воздействия: высокая
Функция фабрик моделей 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);
События увеличения / уменьшения
Вероятность воздействия: низкая
Правильные события модели, связанные с «update» и «save», теперь будут отправляться при выполнении методов increment
или decrement
в экземплярах модели Eloquent.
События
Контракт 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
.
Пагинация
Пагинация по умолчанию
Вероятность воздействия: высокая
Пагинатор теперь использует фреймворк Tailwind CSS для своего стиля по умолчанию. Чтобы продолжать использовать Bootstrap, вам следует добавить boot
метод к методу загрузки AppServiceProvider
вашего приложения:
use Illuminate\Pagination\Paginator;
Paginator::useBootstrap();
Очередь
Метод retryAfter
Вероятность воздействия: высокая
Для согласованности с другими функциями Laravel метод retryAfter
и свойство retryAfter
заданий в очереди, почтовых программ, уведомлений и слушателей были переименованы в backoff
. Вам следует обновить имя этого метода / свойства в соответствующих классах вашего приложения.
Свойство timeoutAt
Вероятность воздействия: высокая
Свойство timeoutAt
заданий в очереди, уведомлений и прослушивателей было переименовано в retryUntil
. Вам следует обновить имя этого свойства в соответствующих классах вашего приложения.
Методы allOnQueue()
/ allOnConnection()
Вероятность воздействия: высокая
Для согласованности с другими методами диспетчеризации были удалены методы allOnQueue()
и allOnConnection()
, используемые с цепочкой заданий. Вместо этого вы можете использовать методы onQueue()
и onConnection()
. Эти методы следует вызвать перед вызовом метода отправки:
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
{
/**
* Путь к «домашнему» маршруту для вашего приложения.
*
* Это используется аутентификацией Laravel для перенаправления
* пользователей после входа в систему.
*
* @var string
*/
public const HOME = '/home';
/**
* Если указано, это пространство имен автоматически применяется
* к маршрутам вашего контроллера.
*
* Кроме того, он устанавливается как корневое пространство имен генератора URL.
*
* @var string
*/
protected $namespace = 'App\Http\Controllers';
/**
* Определите привязки модели маршрута, фильтры шаблонов и т.д.
*
* @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'));
});
}
/**
* Настройте ограничители скорости для приложения.
*
* @return void
*/
protected function configureRateLimiting()
{
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60);
});
}
}
Планирование
Библиотека cron-expression
Вероятность воздействия: низкая
Зависимость Laravel от dragonmantank/cron-expression
была обновлена с 2.x
до 3.x
. Это не должно вызывать каких-либо критических изменений в вашем приложении, если вы не взаимодействуете напрямую с библиотекой cron-expression
. Если вы напрямую взаимодействуете с этой библиотекой, просмотрите ее журнал изменений.
Сессия
Контракт Session
Вероятность воздействия: низкая
Контракт Illuminate\Contracts\Session\Session
получил новый метод pull
. Если вы реализуете этот контракт вручную, вам следует соответствующим образом обновить свою реализацию:
/**
* Получите значение данного ключа и забудьте его.
*
* @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 при выполнении запросов.
Прочее
Мы также рекомендуем вам просматривать изменения в репозитории GitHub laravel/laravel
. Хотя многие из этих изменений не критичны, вы можете захотеть синхронизировать эти файлы с вашим приложением. Некоторые из этих изменений будут рассмотрены в этом руководстве по обновлению, но другие, такие как изменения файлов конфигурации или комментарии, не будут. Вы можете легко просмотреть изменения с помощью инструмента сравнения GitHub и выбрать, какие обновления важны для вас.
Перевод:
https://laravel.com/docs/8.x/upgrade
Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! ;)