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