Версія фреймворка: 8.x

Посібник з оновлення

Значні зміни впливу

Зміни середнього впливу

Оновлення до 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і виберіть, які оновлення є важливими для вас.