Skip to content

Laravel 13 support, dependency refresh, CI and fixes - #29

Merged
Moritz Mazetti (Radiergummi) merged 8 commits into
masterfrom
chore/laravel-13-maintenance
Oct 25, 2026
Merged

Moritz Mazetti (Radiergummi) merged 8 commits into
masterfrom
chore/laravel-13-maintenance

Conversation

@Radiergummi

Copy link
Copy Markdown
Member

Brings the package up to date after a long pause. Breaking: drops Laravel 10 and 11, so this should ship as a new major version.

Changes

  • Laravel 13 support, Laravel 10/11 dropped. The dev tooling now resolves to testbench 11 / Pest 4 on Laravel 13 and testbench 10 / Pest 3 on Laravel 12. Before this, the suite only ever ran on Laravel 12, even with the ^13.0 constraint.
  • Refreshed lock file. Replaces all open Dependabot PRs and clears the 45 composer audit advisories. All of them were in dev dependencies, so package users were never affected.
  • Fix: ResponseCache::clear() doesn't exist. The facade docblock and README documented it, but the method is flush(), so the README example threw.
  • Fix: tag-binding memo in ResponseCache::replaceBinding never matched a lookup and grew for the life of the singleton, which leaks memory under Octane. Removed it. Also replaced Request::get(), deprecated in Laravel 13, with input(). One side effect: request attributes are no longer used to resolve tag bindings. Route parameters, query and body still are.
  • Static analysis and formatting: Pint applied, and PHPStan is clean at level 3.
  • Docs: bootstrap/app.php registration, current requirements, one consistent middleware alias, and a warning that the cache must run after authentication.
  • CI: PHP 8.2–8.5 × Laravel 12/13 × lowest/latest dependencies, plus Pint, PHPStan and audit. Actions are pinned by SHA.

Known issues, not addressed here

Cache tag semantics need a redesign, which is planned as a follow-up:

  • On taggable stores (Redis, Memcached, array), response-cache:clear and ResponseCache::flush() without tags don't remove anything. With default tags configured, delete($uri) also has no effect.
  • On stores without tags (the default is file), flushing clears the entire underlying cache store.
  • flush([...]) adds the default tags, so flushing one tag clears everything when default tags are set.

Verification

Locally on PHP 8.5: tests pass for Laravel 13 (latest and lowest) and Laravel 12 (lowest). Pint, PHPStan and composer audit are clean.

After merging, I'll close the Dependabot PRs and delete the stale chore/dependabot-* and laravel-13 branches.

🤖 Generated with Claude Code

https://claude.ai/code/session_01GGNGyJLoFTM5C474gZPW5q

Laravel 10 and 11 are past their security support window. The dev
tooling now resolves to testbench 11 / Pest 4 on Laravel 13 (and
testbench 10 / Pest 3 on Laravel 12), so the suite actually runs
against the version it claims to support.

The refreshed lock file supersedes all open Dependabot updates and
resolves the 45 advisories reported by `composer audit` (all in dev
dependencies).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GGNGyJLoFTM5C474gZPW5q
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GGNGyJLoFTM5C474gZPW5q
- Install jetbrains/phpstorm-attributes so the #[Deprecated] attribute
  on event getters resolves
- Ignore Pest's dynamic test API in tests/Feature
- Document why Repository calls flush()/tags() outside the contract
- Drop a PHPUnit exception class removed in PHPUnit 12 from @throws

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GGNGyJLoFTM5C474gZPW5q
ResponseCache exposes flush(), so following the documented
ResponseCache::clear() call threw a BadMethodCallException. The facade
docblock now lists the actual public API.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GGNGyJLoFTM5C474gZPW5q
…equest::get()

Resolved tags were stored under the resolved value but looked up by the
template, so the memo never matched and accumulated one entry per
distinct resolved tag for the lifetime of the singleton (a leak under
Octane). Request::get() is deprecated in Laravel 13; input() covers the
query and body parameters it was used for.

Adds feature tests for route and query parameter bindings in tags.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GGNGyJLoFTM5C474gZPW5q
…rder

The README still described Kernel.php registration, listed PHP 8.0 /
Laravel 7 as requirements, and used four different, unregistered
middleware aliases in its examples.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GGNGyJLoFTM5C474gZPW5q
Runs the test suite on PHP 8.2–8.5 against Laravel 12 and 13 with
lowest and latest dependencies, plus Pint, PHPStan and composer audit.
Actions are pinned by commit SHA.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GGNGyJLoFTM5C474gZPW5q
Comment thread composer.lock
Comment thread composer.lock
Comment thread composer.lock
Comment thread composer.lock
Comment thread composer.lock
Comment thread composer.lock
Comment thread composer.lock
Comment thread composer.lock
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GGNGyJLoFTM5C474gZPW5q
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant