Как я обновлял свой проект на Laravel c 10-й версии на 11-ю

от автора

Сегодня, 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, ни в чём себе не отказывая. И помните, что это не универсальный гайд, а всего лишь мой опыт в миграции на новой версии. Если возникают какие-то ошибки, или я что-то не упомянул — не стоит забывать об официальном гайде. Пробуйте, всем удачи.


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


ссылка на оригинал статьи https://habr.com/ru/articles/800497/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *