Conversation
- Remove laravelcollective/html: replace Form::hidden with native HTML in 4 profile blade files (the only usage in the entire codebase) - Remove twbs/bootstrap from composer (dead dep — Bootstrap comes from npm) - Bump PHP requirement to ^8.3 in composer.json - Upgrade Dockerfile and Dockerfile.fly from PHP 8.2 to 8.4 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Bump laravel/framework to ^11.0, with all compatible dependency versions - Remove laravelcollective/html (unused Form::hidden replaced with plain HTML) - Remove bkwld/croppa (no code references), osteel/openapi-httpfoundation-testing (unused) - Add wouternl/laravel-drip fork (edwh/laravel-drip) for L11 support - Fix config/sentry.php: replace closure in before_send with App\Support\SentryBeforeSend::handle - Fix config/audit.php: v14 requires user.resolver key and 'resolvers' (not 'resolver') - Fix tests/TestCase.php: remove ValidatorBuilder (package removed) - Fix tests/Feature/Swagger/SwaggerGenerateTest.php: correct namespace/class name - Remove empty placeholder test files (EventKeyTest, GroupByKeyTest) - Upgrade PHP to 8.4 in both Dockerfiles - Bump nunomaduro/collision to ^8.0, laravel/dusk to ^8.0 for L11 compat
L11 throws MissingAppKeyException at boot if APP_KEY is absent.
getDoctrineSchemaManager() was removed from Laravel 11. The Doctrine DBAL enum workaround is no longer needed; Schema::table()->change() works natively in L11 without it.
- Update laravel/framework to ^12.0 - Upgrade toin0u/geocoder-laravel from ^4.6 to ^13.0 (L12 support) - Upgrade mariuzzo/laravel-js-localization from ^1.10 to ^2.0 (L12 support) - Add edwh/laravel-discourse-sso fork (adds ~12 to illuminate constraints) - Add symfony/psr-http-message-bridge ^7.0 (prevents 8.x selection, needs PHP 8.4) - Remove nunomaduro/collision (conflicts with L12, no v9 exists yet) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Update laravel/framework to ^13.0 - Upgrade php requirement to ^8.3 (L13 minimum) - Upgrade egulias/email-validator to ^4.0.0 (L13 requires ^4) - Upgrade barryvdh/laravel-debugbar to ^4.0 (L13 support) - Upgrade laravel/tinker to ^3.0 (L13 support) - Upgrade msurguy/honeypot to ^1.5 (L13 support) - Upgrade barryvdh/laravel-translation-manager to ^0.6.9 (L13 support) - Upgrade spatie/laravel-validation-rules to ^3.4.4 (L13 support) - Add edwh/laravel-eloquent-query-cache fork (adds ^13.0 illuminate constraint) - Update discourse-sso fork to v2.9.3 (adds ~13 illuminate constraints) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Replace Http\Client\Curl\Client with Geocoder\Laravel\Http\LaravelHttpClient (php-http/curl-client was dropped in geocoder-laravel v13) - Add auto_register_serializable_classes for Laravel 13 cache hardening Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Migrate phpunit.xml to current schema (--migrate-configuration) - Make 14 data provider methods static (required by PHPUnit 10+) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Make 18 more data provider methods static (required by PHPUnit 10+) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…mpat guzzlehttp/promises 1.x uses implicit nullable types that PHP 8.4 deprecates. We can't upgrade promises because addwiki/mediawiki-api-base 3.1 constrains it to ~1.0. Setting convertDeprecationsToExceptions=false stops PHPUnit from treating these vendor deprecations as test failures. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…types PHP 8.4 deprecated implicit nullable parameter types (e.g. `Type $p = null`). guzzlehttp/promises 1.x uses this pattern in functions.php, causing E_DEPRECATED notices that PHPUnit converts to test failures on PHP 8.4 CI. addwiki/mediawiki-api-base 3.1 constrains guzzle-promises to ~1.0 so we can't upgrade to 2.x. Apply a composer patch instead to add explicit `?Type` nullable annotations to the four affected functions. Also reverts the ineffective convertDeprecationsToExceptions=false change (PHPUnit 10 removed that option; the real issue was in the patch layer). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ullable types" This reverts commit 6b9235c.
PHP 8.4 deprecated implicit nullable parameter types (e.g. `Type $p = null`). guzzlehttp/promises 1.x uses this pattern in functions.php, which is loaded as a Composer autoload_files entry -- i.e. on every request when vendor/autoload.php is included, before any PHPUnit or Laravel error handler is registered. addwiki/mediawiki-api-base 3.1 constrains guzzle-promises to ~1.0 so we can't upgrade to 2.x. Instead, use a custom bootstrap.php that temporarily removes E_DEPRECATED from error_reporting during the autoload phase only, then restores the original level. This silences the vendor deprecations without affecting detection of our own code's deprecations. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…types The bootstrap.php approach (build 4980) didn't suppress the deprecations for subprocess-isolated tests. PHP 8.4 emits E_DEPRECATED for implicit nullable types when functions are called, not just when defined, so each test triggers the deprecation again after PHPUnit's error handler is set. Use cweagans/composer-patches to apply explicit nullable types directly to guzzlehttp/promises 1.5.3 src/functions.php. Previous attempt (build 4979) failed because the patch used wrong paths (vendor-relative instead of package-relative). This patch uses a/src/functions.php paths, compatible with patch -p1 from the package directory. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…r-patches cweagans/composer-patches uninstalls and reinstalls guzzlehttp/promises (and cascading dependents) before applying the patch, adding ~8 minutes to container startup. This causes the 10-minute Wait for services timeout. Apply the patch directly via `patch` after `composer install` instead, bypassing the reinstall overhead entirely. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
npm install + playwright browser download (~300MB) are slow on loaded networks and were blocking php-fpm from starting, causing the 10-minute health check to time out. These don't need to be done before php-fpm can serve HTTP — run them in background subshells instead. php-fpm now starts immediately after migrations + artisan setup. By the time Playwright tests run (after 45min of PHPUnit), npm and browser downloads will have long since finished. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…rtifact Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
CircleCI restore_cache restores vendor/ before docker compose up. The container volume-mounts ./vendor/ so composer install is fast (just verifies packages). save_cache stores vendor/ after Wait for services. The guzzle patch uses || true so re-applying to a cached vendor is safe. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
When npm is backgrounded in docker_run.sh, neither public/hot nor public/build/manifest.json exists when php-fpm starts (~2min into startup). Every page request triggers a ViteManifestNotFoundException -> HTTP 500, so the health check never passes. Fix: run npm install + npm run build on the CI host BEFORE starting Docker. public/build/manifest.json then exists in the volume-mounted workspace from the moment php-fpm starts handling requests. Also add node_modules caching so subsequent runs are fast (seconds vs minutes). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
MySQL 8.0 enables binary logging by default, which requires SUPER privilege to create triggers. The restarters user lacks SUPER, so migrate:fresh --seed was failing with SQLSTATE 1419, leaving the DB empty and causing HTTP 500. Moving log_bin_trust_function_creators=1 into mysql/my.cnf ensures it's applied at MySQL startup, before docker_run.sh runs migrations. Previously it was only set in the CI "Setup application" step — but that step runs after "Wait for services", which never completed due to the migration failure. Also capture storage/logs/laravel.log as a CI artifact for future debugging. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
In CI (PHP-FPM), the file cache was returning __PHP_Incomplete_Class for stdClass objects in waste_stats[0], causing E_WARNING → ErrorException → HTTP 500 on every health check request. Root fix: computeStats() now stores waste_stats and device_count_status as plain PHP arrays instead of DB stdClass objects. No class deserialization needed at all. isStatsValid() now also checks waste_stats[0] is an array, so any cached data in old format (stdClass) is treated as invalid and recomputed. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Fixometer::loginRegisterStats(): if Cache::put() fails after the cold-start lock (disk full, backend down), Cache::get() returns null and decorateStats(null) would hit a TypeError. Now falls back to computing uncached. decorateStats(): add ?? [] guard on waste_stats[0] access so a corrupt cache entry returns zeros rather than a fatal error. Trigger migration: attempt SET GLOBAL log_bin_trust_function_creators = 1 before creating triggers; silently catches SUPER-privilege denial so the migration still runs on hosts where the flag is already set in my.cnf (e.g. production). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The runtime `patch` call in docker_run.sh was a workaround: cweagans/composer-patches already manages the other vendor patches, so this one should live there too. cweagans applies patches on fresh installs (cache misses in CI) and the cached vendor already carries the patch from prior builds. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
edwh/laravel-drip was a personal fork. TheRestartProject/laravel-drip is the org-owned fork, currently at the Laravel 10 support commit. The existing laravel-drip-l11 composer patch supplies the L11/12/13 constraint, so behaviour is unchanged — just a cleaner provenance. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.




Summary
Laravel upgrade changes
Laravel 10 → 11
laravel/frameworkto^11.0APP_KEYtophpunit.xml(L11 bootstrap requirement)Laravel 11 → 12
laravel/frameworkto^12.0toin0u/geocoder-laravelfrom^4.6to^13.0(v13 supports L12+)mariuzzo/laravel-js-localizationfrom^1.10to^2.0laravel-discourse-ssofork (upstream constrained to illuminate/auth ≤11)symfony/psr-http-message-bridge: ^7.0pin (prevents 8.x which needs PHP 8.4)nunomaduro/collision(conflicts with L12; no v9 exists)Laravel 12 → 13
laravel/frameworkto^13.0^8.3(L13 minimum)egulias/email-validatorto^4.0.0(L13 requires ^4)barryvdh/laravel-debugbarto^4.0laravel/tinkerto^3.0msurguy/honeypotto^1.5barryvdh/laravel-translation-managerto^0.6.9spatie/laravel-validation-rulesto^3.4.4laravel-eloquent-query-cachefork (upstream constrained to illuminate/database ≤12)discourse-ssofork to v2.9.3 (adds ~13 to illuminate constraints)config/geocoder.php: replaced removedHttp\Client\Curl\Clientwith newGeocoder\Laravel\Http\LaravelHttpClientadapter; addedauto_register_serializable_classesfor L13 cache hardeningForked packages (temporary — PRs submitted upstream)
The following packages did not yet have official Laravel 13 support at the time of this upgrade. Temporary forks add the necessary version constraints:
edwh/laravel-discourse-sso— adds~13toilluminate/auth|routing|supportconstraints (upstream PR Only 5 upcoming events are displayed for a group #54 open)edwh/laravel-eloquent-query-cache— adds^13.0toilluminate/database|supportconstraints (upstream PR DOT-1381 Ignore invalid JSON #243 open)wouternl/laravel-dripsourced fromTheRestartProject/laravel-drip(L11/12/13 constraint added by composer patch)Note:
laravel-discourse-ssoandlaravel-eloquent-query-cacheVCS sources should be moved fromedwhtoTheRestartProjectonce org forks are created.laravel-dripalready uses the org fork.CI infrastructure fixes
Getting CI green required several fixes beyond the Laravel upgrade itself:
PHP 8.4 compatibility
guzzlehttp/promises1.x has implicit nullable parameters deprecated in PHP 8.4patches/composer.patches.jsonsocweagans/composer-patchesapplies it duringcomposer install(removed the shell-levelpatchcall fromdocker_run.sh)convertDeprecationsToExceptionsin PHPUnit config so third-party deprecation warnings don't cause test failuresDocker startup sequencing
public/build/manifest.jsonexists when php-fpm first serves requestsMySQL 8.0 trigger creation
log_bin_trust_function_creators = 1mysql/my.cnfso it applies at MySQL startup, before migrations run (previously only set in the "Setup application" CI step which runs after the health check)SET GLOBAL log_bin_trust_function_creators = 1at startup (best-effort for production, where the DB user lacks SUPER)log_bin_trust_function_creators = 1must be set inrestarters-db.internalmy.cnf before this migration runs in productionStats cache serialization (PHP-FPM specific)
Cache::get()was returning__PHP_Incomplete_ClassforstdClassobjects stored viaDB::select(), causing E_WARNING → ErrorException → HTTP 500 on every requestFixometer::computeStats()to store plain arrays instead of raw DB stdClass objects;isStatsValid()now enforces the array format so any old-format cache is recomputed on first accessCircleCI vendor/ cache
composer.lockchecksum; removed the loose fallback key that could restore vendor/ from a different branchTest plan
log_bin_trust_function_creators = 1inrestarters-db.internalmy.cnf before deploy