Laravel upgrades
Laravel 10 to 11: do you have to adopt the new skeleton?
No. Laravel 11 introduced a slimmer application structure, and Laravel’s own upgrade guide recommends against adopting it on an existing Laravel 10 application. That removes the most alarming part of this upgrade. You do still have work to do, but it’s in your dependencies and migrations, not your folder layout.
By itmarkerz Technologies. Updated 30 October 2026.
What the official guide says
The Laravel 11 upgrade guide is direct: “we do not recommend that Laravel 10 applications upgrading to Laravel 11 attempt to migrate their application structure, as Laravel 11 has been carefully tuned to also support the Laravel 10 application structure.”
So your app/Http/Kernel.php, app/Console/Kernel.php, exception handler and service providers can stay where they are. So can the config files you’ve already published. Tutorials about bootstrap/app.php describe new applications, and if your project doesn’t look like theirs, nothing is wrong.
When the new structure is worth it
It’s an optional tidy-up, so treat it as a separate job, if you do it at all. Mixing it into the version upgrade makes a large diff, and when something fails you can’t tell which change caused it. It can be worth doing later if you’re starting a long period of new development and want new hires to see what the current docs show. If the application is stable and mostly maintained, we’d leave it alone: it adds risk and doesn’t change what your users get.
What you can’t avoid: package majors
The guide lists these updates. In the “stops supporting” cases, such as Passport 11 and Sanctum 3, Composer won’t let you keep the old major on Laravel 11.
| Package | Update to | Also |
|---|---|---|
laravel/framework | ^11.0 | PHP 8.2, curl 7.34 |
nunomaduro/collision | ^8.1 | |
laravel/sanctum | ^4.0 | Publish migrations, update config/sanctum.php middleware |
laravel/passport | ^12.0 | Publish migrations. Password grant off by default |
laravel/cashier | ^15.0 | Publish migrations, read its upgrade guide |
laravel/spark-stripe | ^5.0 | Publish migrations, read its upgrade guide |
laravel/telescope | ^5.0 | Publish migrations |
livewire/livewire | ^3.4 | Livewire 2 applications have a real upgrade here |
inertiajs/inertia-laravel | ^1.0 | |
laravel/octane, breeze, jetstream, dusk, scout | ^2.3, ^2.0, ^5.0, ^8.0, ^10.0 | If installed |
The Livewire row can be most of the project. If you’re on Livewire 2, or on Filament 2, which needs it, that’s a major front-end upgrade hiding in a framework bump. See the package compatibility matrix and our Filament upgrade path.
The migration publishing trap
Cashier Stripe, Passport, Sanctum, Spark Stripe and Telescope stop loading migrations from their own folders. On an existing database the tables are already there, so nothing looks wrong. The issue appears the next time someone runs migrations from empty: a new developer, a CI run or a staging rebuild. Tables are missing, and the error points nowhere near the upgrade. Publish them during the upgrade:
php artisan vendor:publish --tag=sanctum-migrations
php artisan vendor:publish --tag=passport-migrations
php artisan vendor:publish --tag=cashier-migrations
php artisan vendor:publish --tag=telescope-migrationsThen test it for real. Point the application at an empty database, run php artisan migrate, and check that the tables match production. Published files carry fresh timestamps, so on an existing database they’ll show as pending and can try to create tables that exist. Check that behaviour on a copy of production before you release.
The change we’d read most carefully
Our Laravel 10 guide covers the headline breaking changes, including the rule that a change() call must now restate every attribute it wants to keep. It’s worth knowing how to find them:
grep -rn -- "->change()" database/migrationsThis only matters for migrations that will run again. Those already applied in production have done their work. But a fresh install replays them all, under the new rules, so the columns it builds can differ from production without any error. Laravel’s suggested way out is php artisan schema:dump, which squashes the history into a single schema file. Run it from a database that matches production, not from a developer’s copy.
Quieter changes people miss
spatie/once. Laravel 11 has its ownoncefunction, so the guide says to remove this package to avoid a conflict.doctrine/dbal. Laravel no longer depends on it, and methods such asgetDoctrineSchemaManager()are gone. UseSchema::getColumns()and its neighbours.- Password rehashing. Passwords are rehashed at login when the work factor has changed. If your
Usermodel’s password column isn’t calledpassword, setauthPasswordNameor turn rehashing off withrehash_on_login. - A model relationship named
casts. The base model now has acastsmethod, so a relationship with that name conflicts. - Spatial columns. Methods such as
point()andpolygon()give way togeometry()andgeography(). - MariaDB. There’s now a dedicated
mariadbdriver. It’s optional, but if you switch, itsuuidcolumn type is native, so existing migrations need a look first. - Cache key prefixes. Redis, Memcached and DynamoDB prefixes lose their automatic
:. Add it back if you don’t want existing keys to miss once after the release.
An order that keeps the risk down
- Move PHP to 8.3 on Laravel 10 and release that alone. Both framework versions accept it.
- Update whatever can move while still on Laravel 10, one package per release.
- Change the framework and required package majors together, leaving your structure alone.
- Publish package migrations, and test both a fresh install and a copy of production.
- Don’t stop there. Laravel 11 is already past its security window, so continue with 11 to 12 and 12 to 13, ideally in the same project.
Our Laravel upgrade service prices the whole path as one job, after a free assessment. If you’re weighing that against doing it yourself, the cost guide shows our published prices.
Upgrades we have delivered
Cabinet manufacturer's ordering, dealer-portal and inventory system moved from PHP 5.6 and MySQL 5.0 to Laravel 13 on PHP 8.5 and MySQL 8, with a new Next.js front end. Eight months, workflows preserved, now live.
- Sector
- Manufacturing
- Region
- Canada and US
- Stack
- Laravel 13, PHP 8.5, MySQL 8, Next.js
- Engagement
- Upgrade, about eight months, live
Loyalty-card management system we first built on PHP 5.6, re-platformed onto Laravel with all cards, balances and rules preserved. Two months, live since mid-2026, Indian client.
- Sector
- Retail & loyalty
- Region
- India
- Year
- 2026
- Stack
- Laravel
- Engagement
- Upgrade of our own earlier build, two months
Questions
Do I have to move to the slim application structure in Laravel 11?
No. Laravel’s upgrade guide says it does not recommend that Laravel 10 applications migrate their structure, because Laravel 11 is tuned to support the Laravel 10 structure as well.
Can I still use app/Http/Kernel.php and my service providers?
Yes. An upgraded application can keep them. The new bootstrap/app.php style is the default for new applications, not a requirement for existing ones.
What PHP version does Laravel 11 need?
PHP 8.2 or later. Laravel’s table lists PHP 8.2–8.4, while Laravel 10 supports PHP 8.1–8.3. If you’re on 8.1, move PHP first. PHP 8.3 works on both, and it’s a better target than 8.2 because 8.2 security support ends on 31 December 2026.
Should I stop at Laravel 11?
No. Laravel 11 security fixes ended on March 12, 2026, so it’s a step on the way and not a place to stay. Laravel 13 has security fixes until March 17, 2028.
More on Laravel upgrades
- Laravel package compatibility matrixWhich release of each common package allows which Laravel and PHP version.
- Laravel 12 end of life: what to do firstThe security deadline, and the two things that block Laravel 13.
- PHP 8.2 end of life for Laravel teamsChoosing between PHP 8.3, 8.4 and 8.5 before the deadline.
- Laravel on PHP 8.5: what actually breaksDeprecations to search for, including the PDO constants.
- Upgrading from Laravel 11 to 12Carbon 3, UUIDs and file paths: the changes that throw no errors.
- Upgrading Laravel 5–9Step through each version, move to a fresh install, or rebuild.
- Laravel Shift or an upgrade teamWhen an automated tool is enough, and when it isn’t.
- Filament upgrade path to Laravel 13Which order to move in from Filament 2, 3, 4 or 5.
- Which Laravel version do you need for the AI SDK?The version floors, and what to do if you’re below them.
- Laravel 14: release window and how to planWhat’s known, what isn’t, and what to do today.
- Inherited a Laravel app? The first 10 daysAccess, backups, an inventory and a safe deploy, before any new features.
- Laravel 11 end of life: what to do nowStop at Laravel 12 or go straight to 13.
- Laravel 10 end of life: your upgrade optionsFour routes off Laravel 10, and the breaking changes in the first step.
- How much does a Laravel upgrade cost?Our published prices by application size, and what moves a quote.
- Upgrading from Laravel 12 to 13The changes that matter, in the order we would check them.
- PHP 8.1 end of life and LaravelWhy PHP can move before the framework does.
- Laravel upgrade checklistEvery step from inventory to the first week after release.
- Laravel vs Symfony: an upgrade decisionSupport windows compared, and when changing framework makes sense.
Moving off Laravel 10?
Share your repository or composer.json. We’ll tell you which of these apply to you, and give you a fixed price to reach a supported version.
We reply within one business day (IST).