10 KiB
Upgrade Log: Goos — Laravel 11 → 12 + Full Ecosystem
Date: 2026-02-10 / 2026-02-11 Branch:
laravel-v12
Version Changes
Composer (PHP)
| Package | Before | After | Notes |
|---|---|---|---|
| laravel/framework | 11.47.0 | 12.50.0 | |
| filament/filament | 3.3.45 | 5.2.1 | Via v4 rector then v5 rector |
| livewire/livewire | 3.x | 4.1.4 | |
| pestphp/pest | 2.x | 4.3.2 | PHPUnit 12 |
| barryvdh/laravel-debugbar | 3.x | 4.0.7 | |
| inertiajs/inertia-laravel | 1.3.3 | 2.1.0 | |
| jeffgreco13/filament-breezy | 2.6.4 | 3.1.1 | |
| ariaieboy/filament-currency | 1.13.0 | 3.0.0 | |
| amidesfahani/filament-tinyeditor | 3.0.0 | 4.0.5 | |
| ralphjsmit/laravel-filament-components | 2.2.0 | 3.1.0 | |
| mollie/laravel-mollie | 3.1.0 | 4.0.2 | |
| symfony/http-client | 7.x | 8.x | |
| symfony/mailgun-mailer | 7.x | 8.x | |
| laravel/sanctum | 3.x | 4.x | |
| nunomaduro/collision | 7.x | 8.x | |
| codezero/laravel-localized-routes | 4.0.1 | removed | Replaced |
| codezero/laravel-localizer | 3.0.0 | removed | Unused |
| opgginc/codezero-laravel-localized-routes | — | 5.x | Replacement fork |
| filament/spatie-laravel-translatable-plugin | 3.3.45 | removed | Deprecated in Filament v4 |
| lara-zeus/spatie-translatable | — | 2.x | Replacement |
| johncarter/filament-focal-point-picker | 3.1.0 | removed | No Filament v5 support |
| pestphp/pest-plugin-browser | — | 4.2 | New — browser testing |
NPM (Frontend)
| Package | Before | After | Notes |
|---|---|---|---|
| tailwindcss | 3.3.2 | 4.1.18 | Manual migration |
| vite | 6.x | 7.3.1 | Required by laravel-vite-plugin v2 |
| @inertiajs/vue3 | 1.x | 2.x | |
| laravel-vite-plugin | 1.x | 2.x | |
| @vitejs/plugin-vue | 5.x | 6.x | |
| @vueuse/core | 10.x | 14.x | |
| vue-i18n | 9.x | 11.x | |
| swiper | 10.x | 12.x | |
| @gtm-support/vue-gtm | 2.x | 3.x | |
| autoprefixer | 10.x | removed | Not needed with TW v4 |
| @tailwindcss/forms | 0.5.x | removed | Built into TW v4 |
| @tailwindcss/typography | 0.5.x | removed | Built into TW v4 |
| @tailwindcss/aspect-ratio | 0.4.x | removed | Built into TW v4 |
| eslint-plugin-tailwindcss | 3.x | removed | No TW v4 support |
| @tailwindcss/postcss | — | 0.x | New — TW v4 PostCSS plugin |
| @tailwindcss/vite | — | 4.x | New — TW v4 Vite plugin |
| playwright | — | latest | New — browser testing |
All Issues Encountered
1. codezero packages block Laravel 12
Error: codezero/laravel-localized-routes ^4 and codezero/laravel-localizer ^3 have no Laravel 12 support.
Fix:
- Replaced
codezero/laravel-localized-routeswithopgginc/codezero-laravel-localized-routes ^5.0 - Removed
codezero/laravel-localizerentirely (unused — no PHP code referencesCodeZero\Localizer) - Removed
codezero/composer-preload-filesfromallow-pluginsincomposer.json
2. codezero/composer-preload-files plugin blocked Composer
Error: After removing from allow-plugins, the plugin still existed in vendor. Composer refused to run any command.
Fix: composer config --no-plugins allow-plugins.codezero/composer-preload-files false
3. Localized routes: /en/ prefix no longer generated
Error: PageTest fails — redirects for English locale no longer have /en/ prefix (e.g., /ds instead of /en/ds).
Status: Open. Needs investigation — may be a config difference in the opgginc v5 fork. The config/localized-routes.php has omitted_locale => 'nl', so English should get prefixed.
File: tests/Feature/Cms/Models/PageTest.php
4. johncarter/filament-focal-point-picker incompatible with Filament v5
Error: Latest v4.1.0 and dev-main only support filament/filament ^3.0|^4.0.
Fix: Removed the package. Replaced FocalPointPicker with TextInput for focal point fields (stores coordinates as string like "50% 50%").
Files:
cms/Filament/Form/Fieldset/ImageForBlock.phpcms/Filament/Form/Fieldset/ImageVariantForBlock.php
5. filament/spatie-laravel-translatable-plugin deprecated
Error: No v5 release. Package deprecated in Filament v4.
Fix: Replaced with lara-zeus/spatie-translatable ^2.0 (recommended by Filament upgrade rector). Namespace changed from Filament\SpatieLaravelTranslatablePlugin → LaraZeus\SpatieTranslatable\SpatieLaravelTranslatablePlugin (handled by rector).
File: app/Providers/Filament/AdminPanelProvider.php
6. laravel-vite-plugin v2 requires Vite 7
Error: npm install fails — laravel-vite-plugin ^2 has peer vite@"^7.0.0".
Fix: Updated vite from ^6.2.0 to ^7.0.0 in package.json.
7. eslint-plugin-tailwindcss incompatible with Tailwind v4
Error: npm install fails — eslint-plugin-tailwindcss ^3 requires tailwindcss ^3.4.0.
Fix: Removed from devDependencies. TW v4 ESLint plugin support does not exist yet.
8. Tailwind v3 → v4: manual migration required
Error: The automated @tailwindcss/upgrade tool fails with callback-based theme extensions, FormKit plugin, and @apply in @layer base.
Fix: Manual migration:
postcss.config.js— replacedtailwindcss + autoprefixerwith@tailwindcss/postcssresources/css/app.css— replaced@tailwinddirectives with@import "tailwindcss", added@theme {}block with custom colors/fonts/spacingresources/css/utility.css— converted all@layer baseclasses using@applyto@utilityblocks with plain CSS (including media queries for responsive values)- Removed
tailwind.config.jsconfiguration (moved to CSS-first config) - Removed plugins:
@tailwindcss/forms,@tailwindcss/typography,@tailwindcss/aspect-ratio,autoprefixer
9. Inertia v2 SSR config change
Error: @inertiajs/server no longer exists in Inertia v2.
Fix: Changed ssr.noExternal from ['@inertiajs/server'] to ['@inertiajs/vue3'] in vite.config.js.
10. Filament v5: Component::$container uninitialized error
Error: Typed property Filament\Schemas\Components\Component::$container must not be accessed before initialization — thrown when calling getChildComponents() on Filament form components outside a Livewire context (during frontend page rendering via the CMS Block system).
Root cause: Filament v5's getChildComponents() creates a Schema wrapper that requires getLivewire(), which fails outside Filament admin panel context.
Fix: Replace getChildComponents() with getDefaultChildComponents() which returns raw component arrays without requiring a Schema/Livewire container.
File: cms/Filament/Blocks/Block.php — methods getSchema() and hasSettings()
11. Filament v5: Field::make() signature change
Error: Declaration of DisplayText::make(string $name = ''): static must be compatible with Field::make(?string $name = null): static
Fix: Changed make(string $name = '') to make(?string $name = null) and pass $name ?? '' to parent.
File: app/Forms/Components/DisplayText.php
12. PHPUnit 12 drops @test annotation support
Error: Tests using /** @test */ are silently not discovered — INFO No tests found.
Fix: Replaced all /** @test */ annotations with #[PHPUnit\Framework\Attributes\Test] attribute in all 7 test files. Added use PHPUnit\Framework\Attributes\Test; import to each.
Files:
tests/Feature/Cms/Models/PageTest.phptests/Feature/Cms/Models/RedirectTest.phptests/Feature/Models/UserTest.phptests/Feature/Services/Filament/HelperTest.phptests/Feature/Commerce/Actions/Order/CreateOrderFromCheckoutTest.phptests/Feature/Http/Controller/Public/FormControllerTest.phptests/Feature/Http/Controllers/Api/V0/AddressCheckControllerTest.php
13. PHPUnit 12 / Pest v4: setUp() must be protected
Error: Access level to Pest\Concerns\Testable::setUp() must be public (as in class Tests\TestCase) — fatal error on any test run.
Fix: Changed public function setUp(): void to protected function setUp(): void.
File: tests/TestCase.php
14. Filament v5: ViewAction on ListRecords pages crashes
Error: Resource::getViewAuthorizationResponse(): Argument #1 ($record) must be of type Model, null given — thrown when rendering ViewAction header actions on list pages.
Root cause: In v5, ViewAction tries to authorize against a record, but list pages have no record (null).
Fix: Replace ViewAction::make() with Action::make('name') for navigation-only header actions that don't operate on a record.
File: cms/Filament/Resources/BlogResource/Pages/ListBlogs.php
15. Filament v4/v5 rector scripts
Note: Rector must run for EACH custom namespace directory separately: app/, cms/, commerce/, modules/, support/. No manual $navigationGroup/$navigationIcon type fixes needed in this project (uses method overrides).
Files: 112+ files modified by rector across all directories.
Files Modified (manual changes only, excluding rector)
| File | Change |
|---|---|
composer.json |
Version constraints, package replacements |
package.json |
Version constraints, removed TW plugins, cleanup |
postcss.config.js |
TW v4 PostCSS plugin |
resources/css/app.css |
TW v4 directives + @theme block |
resources/css/utility.css |
@layer base → @utility blocks |
vite.config.js |
SSR noExternal fix |
cms/Filament/Blocks/Block.php |
getChildComponents() → getDefaultChildComponents() |
cms/Filament/Form/Fieldset/ImageForBlock.php |
FocalPointPicker → TextInput |
cms/Filament/Form/Fieldset/ImageVariantForBlock.php |
FocalPointPicker → TextInput |
cms/Filament/Resources/BlogResource/Pages/ListBlogs.php |
ViewAction → Action |
app/Forms/Components/DisplayText.php |
make() signature fix |
tests/TestCase.php |
setUp() visibility |
tests/Pest.php |
Browser test suite binding |
phpunit.xml |
Browser test suite |
tests/Browser/PageTest.php |
New — browser smoke tests |
tests/Feature/**/*Test.php (7 files) |
@test → #[Test] attribute |
Final State
- Feature/Unit tests: 15 passed, 1 failed (PageTest locale prefix — codezero fork issue)
- Browser tests: 4 passed (homepage, terms, contact, products)
- Frontend build: Clean (client + SSR), 0 npm vulnerabilities
- 169 files changed total (including rector, vendor assets, lock files)