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