Посібник з оновлення
Значні зміни впливу
- Model Factories
-
Queue
retryAfter
Method -
Queue
timeoutAt
Property -
Queue
allOnQueue
andallOnConnection
- Pagination Defaults
- Seeder & Factory Namespaces
Зміни середнього впливу
- PHP 7.3.0 Required
- Failed Jobs Table Batch Support
- Maintenance Mode Updates
-
The
php artisan down --message
Option -
The
assertExactJson
Method
Оновлення до 8.0 з 7.x
Розрахунковий час оновлення: 15 хвилин
Ми намагаємося задокументувати всі можливі порушення. Оскільки деякі з цих невід'ємних змін знаходяться в незрозумілих частинах фреймворку, лише частина цих змін може насправді вплинути на вашу програму.
Потрібно PHP 7.3.0
Ймовірність впливу: середній
Нова мінімальна версія PHP тепер 7.3.0.
Оновлення залежностей
Оновіть наведені нижче залежності у вашомуcomposer.json
файл:
-
guzzlehttp/guzzle
to^7.0.1
-
facade/ignition
to^2.3.6
-
laravel/framework
to^8.0
-
laravel/ui
to^3.0
-
nunomaduro/collision
to^5.0
-
phpunit/phpunit
to^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 - true
isset($collection[0]);
// Laravel 8.x - false
isset($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/"
}
},
Красномовний
Модельні фабрики
Ймовірність впливу: висока
Ларавелямодельні заводиФункція була повністю переписана для підтримки класів і не сумісна з фабриками стилю 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
методи на екземплярах красномовної моделі.
Події
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
Варіант
Ймовірність впливу: низька
A--no-reload
опція була додана доphp artisan serve
команди. Це дасть вказівку вбудованому серверу не перезавантажувати сервер, коли будуть виявлені зміни файлів середовища. Цей параметр в першу чергу корисний під час запуску тестів 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
клас містив a$namespace
властивість зі значеннямApp\Http\Controllers
. Це значення цієї властивості було використано для автоматичного префікса оголошень маршруту контролера та генерації URL-адреси маршруту контролера, наприклад, під час викликуaction
помічник.
У Laravel 8 для цієї властивості встановлено значенняnull
за замовчуванням. Це дозволяє оголошенням маршрутів контролера використовувати стандартний синтаксис, що викликається PHP, що забезпечує кращу підтримку переходу до класу контролера у багатьох середовищах розробки:
use App\Http\Controllers\UserController;
// Using PHP callable syntax...
Route::get('/users', [UserController::class, 'index']);
// Using string syntax...
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);
});
}
}
Планування
cron-expression
Бібліотека
Ймовірність впливу: низька
Залежність Ларавеля від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і виберіть, які оновлення є важливими для вас.