Сегодня, 12 марта 2024, года официально вышла Laravel 11. Спустя час после этой новости я решил обновлять свой небольшой пет-проект, который сделан на Laravel 10 до 11-й версии. И вот, сейчас я поделюсь с вами тем, как я обновлялся и какие подводные камни могут быть. Погнали.

Проект написан на Laravel 10. Так же в нём используется Inertia.js (Vue 3), Laravel Octane (swoole), Laravel Sanctum. Ну и PostreSQL 15, minio, redis, mailhog, но всё это не относится к статье про миграцию на новую версию. Первым шагом я пошёл на официальный сайт laravel и нашёл статью по миграции с 10-й версии до 11-й, и пошёл смотреть сверху вниз.

Первым делом поменял все зависимости в composer.json. Вот у меня он стал таким:

    "require": {
        "php": "^8.2",
        "doctrine/dbal": "^3.0",
        "godruoyi/php-snowflake": "^2.1",
        "guzzlehttp/guzzle": "^7.2",
        "inertiajs/inertia-laravel": "^1.0",
        "laminas/laminas-diactoros": "^3.3",
        "laravel/framework": "^11.0",
        "laravel/octane": "^v2.3.4",
        "laravel/sanctum": "^4.0",
        "laravel/tinker": "^2.7",
        "league/flysystem-aws-s3-v3": "^3.0",
        "livewire/livewire": "^3.4",
        "predis/predis": "^2.0",
        "tightenco/ziggy": "^1.0"
    },
    "require-dev": {
        "fakerphp/faker": "^1.9.1",
        "laravel/breeze": "^2.0",
        "laravel/pint": "^1.0",
        "laravel/sail": "^1.0.1",
        "mockery/mockery": "^1.4.4",
        "nunomaduro/collision": "^8.0",
        "phpunit/phpunit": "^10.0",
        "spatie/laravel-ignition": "^2.0"
    },

Далее последовала команда composer update (вернее ./sail composer update, но это для нужно если у вас всё крутится в докере), и в ожидании падения всего перезагружаю страницу с проектом и... Всё работает так же, как работало. Только версия Laravel обновилась. Всё, my congratulations, у вас всё получилось, вы обновились до 11-й версии Laravel.

Но я бы не был мной, если бы не захотел добавить всё то, что изменили в новой версии. Так что "идём по некселю", как говорил один популярный стример. По пути ./bootstrap создаём файлик providers.php, куда вносим следующий код:

<?php

// Тут мы добавляем все сервис-провайдеры, которые задействуем в проекте
return [
    \App\Providers\AppServiceProvider::class,
    \App\Providers\AuthServiceProvider::class,
    \App\Providers\BroadcastServiceProvider::class,
    \App\Providers\EventServiceProvider::class,
    \App\Providers\RepositoryServiceProvider::class,
    \App\Providers\RouteServiceProvider::class
];

И дальше, в этой же папке, в файлике app.php сносим весь код к чертовой бабушке и пишем вот это:

<?php
    
use App\Http\Middleware\EncryptCookies;
use App\Http\Middleware\HandleInertiaRequests; // это необходимо для Inertia.js, если у вас его нет - то не надо юзать этот мидлвейр
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;

$application = Application::configure()
    ->withProviders()
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        api: __DIR__.'/../routes/api.php',
        commands: __DIR__.'/../routes/console.php',
        channels: __DIR__.'/../routes/channels.php',
    )
    ->withMiddleware(function (Middleware $middleware) {
        $middleware->web(append: [
            HandleInertiaRequests::class, // это от Inertia.js, без него Inertia будет кидать ошибки на подобии "props 'user' не найден"
        ], replace: [
            \Illuminate\Cookie\Middleware\EncryptCookies::class => EncryptCookies::class, // тут нужно заменить мидлвейр EncryptCookies если у вас какие-то cookies помечены как $except, или какие-то другие манипуляции с cookies
            // Вообще, этот механизм используется для подмены стандартных миддлвейров - они теперь лоадятся внутри ядра фреймворка, минуя Kernel.php
            // Прочитать можно тут https://laravel.com/docs/11.x/middleware#laravels-default-middleware-groups
            // И тут https://laravel.com/docs/11.x/middleware#laravels-default-middleware-groups
        ]);
        
        /* 
        А вот так добавлять новые алиасы миддлвейров
        $middleware->alias([
            'check' => CheckMiddleware::class,
        ]);*/
    })
    ->withExceptions(function (Exceptions $exceptions) {
        // тут же регистрируем свои Exceptions, которые описаны в app/Exceptions/Handler.php
    })
    /*
    А вот так регистрируются кастомные команды
    ->withCommands([
        __DIR__.'/../app/Console/Commands/CreateAdminCommand.php',
    ])*/
    ->create();

return $application;

Вся документация по мидлвейрам находится вот тут.

Теперь меняем код в файлике artisan в корне проекта на вот этот:

#!/usr/bin/env php
<?php

use Symfony\Component\Console\Input\ArgvInput;

define('LARAVEL_START', microtime(true));

// Register the Composer autoloader...
require __DIR__.'/vendor/autoload.php';

// Bootstrap Laravel and handle the command...
$status = (require_once __DIR__.'/bootstrap/app.php')
    ->handleCommand(new ArgvInput);

exit($status);

А дальше удаляем эти файлы:

app/Http/Kernel.php
app/Exceptions/Handler.php
app/Console/Kernel.php

Вот теперь всё, запускаем наше приложение и радуемся тому, что всё работает замечательно.

А какие подводные камни возникли, спросит любопытный читатель?

По крайней мере у меня возникла вот такая:

PHP Warning:  require(/var/www/html/vendor/composer/../laminas/laminas-diactoros/src/functions/marshal_uri_from_sapi.php): Failed to open stream: No such file or directory in /var/www/html/vendor/composer/autoload_real.php on line 41

Помогло даже не установка пакета composer require laminas/laminas-diactoros, а снос всей папки ./vendor/ и установка всех библиотек заново (composer install если вдруг кто забыл).

Вот теперь можно писать с кайфом на свежей версии Laravel, ни в чём себе не отказывая. И помните, что это не универсальный гайд, а всего лишь мой опыт в миграции на новой версии. Если возникают какие-то ошибки, или я что-то не упомянул - не стоит забывать об официальном гайде. Пробуйте, всем удачи.


Телеграм канал в котором я редактор. Не подписывайтесь.

Комментарии (3)


  1. FanatPHP
    15.03.2024 11:42

    С прошлым аккаунтом не зашло, приходится рекламировать свой канальчик в новом? :)


    1. my_dear_karman Автор
      15.03.2024 11:42

      я второй редач в канале)


      1. FanatPHP
        15.03.2024 11:42

        Ахаха, уровень убедительности: бог ))))
        С мамкой, когда говоришь что живот болит если в школу идти не хочется, прокатывает?