fix(router): clear the matched route between requests - #2278
Merged
Conversation
Benchmark ResultsComparison of Open to see the benchmark results
Generated by phpbench against commit c31738d |
Member
|
Nice! Looks good to me. |
aidan-casey
reviewed
Sep 6, 2026
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.
Implement
RouterResetto unregisterMatchedRoutefrom the container during resets, and clear the binding inMatchRouteMiddlewarebefore matching.Problem
MatchRouteMiddlewarebindsMatchedRouteinto the container as a singleton. In long-running workers (FrankenPHP worker mode) or test suites where the container is reused across requests, this state leaks across boundaries:GenericContainer::reset()clears resolved singletons and dynamic initializers, but notsingletonDefinitions, where the binding lives. Anything sharing the container - the next request, a console command, a deferred task - incorrectly inherits the previous request's matched route, causing stale data in URI generation, route model binding, and middleware execution.Solution
RouterResetimplementingResettableto automatically unregisterMatchedRoute::classduring container resets, discovered viaResettableDiscoveryand following the existing resets from worker mode support (feat(core)!: worker mode support #2172).MatchedRoutebinding insideMatchRouteMiddlewarebefore running a new match, ensuring safe reuse even when container resets do not occur, ie in test suite: