Support for Drupal 7 is ending on 5 January 2025—it’s time to migrate to Drupal 10! Learn about the many benefits of Drupal 10 and find migration tools in our resource center.
Problem/Motivation
In the road of simplifying the routing system, I would like to propose another change.
Back in 2015 when we tried to get Drupal 8 out and routing was one of the major performance issues, we decided to move the routing system to become more lazy. One step of that was to introduce the idea of lazy route filters and enhancers, so services, which aren't loaded on every request.
There are a couple of problems with them though:
- Its hard to debug (you filter go to all route filters and then you do another loop)
- The priorities are not taken into account properly (they aren't shared between lazy and non lazy route filters)
- The additional layer of indirection is also potential a bit slower
Proposed resolution
- Make every route filter and enhancer "lazy"
- Make the router aware of the class resolver
- Inject all route filter/enhancer IDs into the router class.
Remaining tasks
User interface changes
API changes
Data model changes
Comment | File | Size | Author |
---|---|---|---|
#112 | 2883680-112.add_routeinterface_to_8.4_and_8.3.patch | 1010 bytes | jonathan1055 |
Comments
Comment #2
andypostComment #3
Wim LeersI strongly agree that simplifying this would improve DX — I've had to step through this several times in the past year, and it was hard.
If this also would improve performance, hurray!
Comment #4
dawehnerI'll work on that during a travel
Comment #5
Wim Leers\o/
Comment #6
dawehnerThis installs at least. On top of that I ran
\Drupal\Tests\rest\Functional\EntityResource\Node\NodeJsonAnonTest
, and it went fine, unless what I excepted ;)We will have to have a lot of conversations about backward compatibility (BC).
Comment #8
dawehnerLet's see what happens when we have one less notice
Comment #10
larowlanMakes sense so far.
Added a minor initialization change which should assist with some of the fails.
Comment #11
dawehnerLet's see what happens if we remove some more code ...
Comment #13
dawehnerLet's remove some more files ...
Comment #15
Wim Leers#11 & #13 removed services that other services depended upon. So we also needed to remove those depending services. Let's see if this passes.
Comment #16
Wim LeersNote: this has the potential to make #2858482: Simplify REST routing: disallow requesting POST/PATCH in any format, make consistent a lot easier, because some of the necessary routing system bugfixes would have been done by this issue. And we'd have simplified the routing system at the same time. So this helps the API-First Initiative.
Also: this is a sister issue of #2472337: Provide a lazy alternative to service collectors which just detects service IDs, which introduced the "service ID collector" concept. So associating that CR with this issue.
Comment #17
Wim LeersThe changes I made #15 were too simplistic. I just removed the services that no longer worked. I should have checked whether they actually were safe to remove. They're not. #15 causes lots of REST test failures (YAY REST test coverage!).
Figuring out how to resolve this correctly…
Comment #18
dawehnerI'm not surprised by that. We now respect priorities unlike before.
Comment #20
Wim LeersThe problem with #11/#13/#15 is that they don't determine anymore during route building which filters/enhancers should be applied to a particular route.
… but the patch so far (quoting code from #10, which passed) is still assuming that that work is actually done.
So either:
Route(Filter|Enhancer)Interface::applies()
at runtime.For now, going with the simplest option: number 2. In theory, it should be slower, because we're doing more work on every request. Profiling will have to show whether it's faster, slower, or the same.
But turns out that this:
… does not work at all. When you use
service_id_collector
, you can't specify acall
. The collected service IDs are always passed to the service constructor. So the fact that #10 passes shows that it caused no functional changes (all the actual route filter/enhancer stuff still worked because #11+#13+#15 hadn't happened yet). This is exactly why we're doing this simplification! :)This then actually points to the next problem: the current patch is collecting the service IDs for both
route_filter
andnon_lazy_route_filter
, and pretending like it's merging them together in the appropriate order. But it's not doing any of that. We have to retain BC, which is easy enough: the non-lazy ones should always run before the lazy ones. That's how it works in HEAD. We can easily retain that.So I'm afraid this:
is not at all correct. It's also the conclusion I'd have jumped to if I didn't actually debug the code though, so I completely understand! :) But hopefully the above explains sufficiently clearly what's actually been happening.
Attached is a patch that makes things work again. At least mostly. Looking forward to reviews/see how this patch will continue!
Comment #21
Wim LeersBTW #15 had "CI aborted" not due to some CI problem, but because it caused a majority of tests to fail, which caused the test run to take super long:
I'm fairly confident that #20 will at least successfully complete testing. It will still have test failures (I know that some REST tests will fail, more about that later), but most tests will pass.
Comment #22
dawehnerNice work @Wim Leers
So yeah the work I started was really explorative!
Comment #24
Wim LeersIn REST, I was seeing 405s instead of 404s when there were zero matching routes. This is because:
The route collection
$collection
returned by the first method call contained zero routes. The first filter to be applied was theMethodFilter
… which throws a 405 in case of zero routes at the end of it.So #13 is somehow changing things: "empty route collection" no longer results in a 404. I don't know yet how exactly, but this fixes it. And that in turn fixes all REST tests.
I'll leave it to @larowlan and @dawehner to fix the remaining failures.
Comment #25
Wim LeersSee #2858482-39: Simplify REST routing: disallow requesting POST/PATCH in any format, make consistent, this is now blocking that issue.
Comment #27
tim.plunkettLooking into this more. For now, copying the old priority onto the service that needs it most, ParamConversionEnhancer:
Comment #28
dawehnerThank you @Wim Leers and @tim.plunkett for driving this forward! Highly appreciated to reduce the crazyness of the routing system more.
A couple of questions we need to answer:
Router::$sortedEnhancers
andRouter::$sortedFilters
used to exist. What should we do with them?Router::addRouteEnhancer
andRouter::addRouteFilte
no longer exist. We could add them back and then let them do nothing?This additional condition is a bit weird, IMHO, what about the changes in the code?
I think we should avoid doing that. This is all why we had the lazy router filters/enhancers in the first place. Otherwise I don't see why we actually have to change the router at all. This is exactly what it is doing right now :)
Comment #29
dawehnerLet's work on this more dramatic approach for a while.
Comment #31
Wim Leers#27: HAH! Of course @tim.plunkett manages to turn 183 failures into 0 failures with a single line change :D
#28:
They're an implementation detail that we don't need anymore. I don't see a problem with them being gone? Oh, #2810303: Reunite the router: One router to rule them all added them and made them available via public getters, darn. But AFAICT that was a mere accident? The API is
\Symfony\Component\Routing\RouterInterface
, not\Drupal\Core\Routing\Router
. So I still think it's fine to remove them.These were definitely implementation details. The only reason those were public, is because the old
service_collector
pattern needed public methods to inject them. You can still add route enhancers/filters: tag them appropriately. This is what matters.I agree. See the explanation in #24. I didn't find a more elegant way to solve it. You know the routing system better, you probably can figure out what code was doing this before? I already did much of the debugging — see #24 :)
Fair!
#29: I don't understand this change in direction?
Comment #32
Wim LeersI got this tell yesterday from @dawehner:
Thoughts below.
OTOH, the issue title says
, which is why I thought this was part of the plan. And I'm not sure it'd be that much slower since:ContentTypeHeaderMatcher
andMethodFilter
already run 100% of the time (that's 66% of our route filters). OnlyRequestFormatRouteFilter
is actually lazy.ParamConversionEnhancer
runs 100% of the time and it's the most costly one. The other route enhancers do seem to benefit from being lazy.Essentially: ignoring the
applies()
method on route filters and enhancers that Drupal layered on top would make things simpler: because then we're back to just the original concept, not our forked version of it.But that's of course a bigger change, and should not delay this issue — I think it's out of scope to change that here. I simply took a shortcut in #20 to get the patch to mostly work. I still agree with @dawehner in #28.
Comment #33
dawehnerTim told me yesterday that they switched away from using lazy route filters for page manager and just run all the time. Given that I think its not realistic to keep them lazy anymore indeed. I would propose to still run the applies method, but load them all, which is exactly what the patch is doing.
Its not a full change of direction. It just changes from initialising the services in the constructor, to using the tagged handler capability to inject the actual objects.
Indeed many of those things have been implementation details. I guess its fine to drop those things in the next minor version, right?
Also keep in mind, the access aware router is probably on top of that as well, so people cannot just directly access those methods, unless they inject this specific user.
Comment #34
Wim LeersOh, interesting!
D'oh, right!
IMO yes.
Exactly! That means the likelihood of somebody using the
router.no_access_checks
service directly and using that (newly added in the previous minor!)addRouteEnhancer()
method is as close to zero as it can get.Does that mean the only thing that remains to be done here is profiling?
Comment #35
tim.plunkettPage Manager had to switch to non-lazy route filters, in order to use priority.
http://cgit.drupalcode.org/page_manager/commit/?id=292cddfeca17bea8b95fb...
The key to this change is that your ::filter() method should exit as soon as possible. I essentially moved the logic from the old ::applies() method into the top of ::filter()
Comment #36
Wim LeersI see, so also because of this bug, which was also surfaced in #2858482: Simplify REST routing: disallow requesting POST/PATCH in any format, make consistent and #2839658: LazyRouteFilter doesn't handle priority.
Yep. And that's how Symfony's route filters/enhancers are actually meant to be used.
We should deprecate Drupal's extending interfaces for Drupal 9, and we can keep calling
applies()
in Drupal 8 to maintain BC.Thanks for the clarifications Tim!
Comment #37
dawehner@trigger_error
to the two interfaceComment #39
tim.plunkettGuessing this is an artifact of refactoring, but you shouldn't need the alias now (here and a couple other places)
Do we still need this addition?
Hmm. Still need to figure this out
Comment #40
dawehnerWasn't there a problem with some opcode caching if you bring in a class/interface which shares a name with something that exists in the current namespace? I remembered some weird problem there.
Let's try it out :)
Comment #42
Wim LeersThis should make the CI test run at least succeed (although I think there will still be a number of failures because #39.2 was removed — but we'll see!).
Comment #44
Wim LeersBoatloads of failures like this in the test results:
And not just in REST.
My analysis from #24 is relevant again. So bringing back that fix.
Comment #46
pfrenssenComment #48
dawehnerI did a little bit of investgation and realized that we need to adapt the route filters to reorder the routes properly.
* First the routes, which have a route format specified and its matching the current request
* Then the routes, which have no route format specified
* Throw away the ones which have a route format specified, but don't have a matching one
Comment #50
Wim Leers#48 sounds sensible.
Rerolled to make one more test pass.
Comment #52
dawehner@Wim Leers
I thought about just removing it, but then I thought about it some more. Some of this code is moved to the filter function, so I think we should rewrite some of the existing tests, to include stuff.
Comment #53
dawehnerDrupal\Tests\taxonomy\Functional\Views\TaxonomyDefaultArgumentTest
was an interesting test. The overall reason was caused by\Drupal\Core\Routing\MethodFilter::filter
reordering the routes. I reverted all the changes from this file, because they are actually not needed.LazyRouterFilter would have executed \Drupal\Core\Routing\MethodFilter::filter when there was a single route with methods specified. In this case the behaviour is already the same. In case there was no method, it would have skipped MethodFilter::filter().
There is though no difference when we keep the existing code, as nothing is happening when no route specifices methods:
Given that we can leave
\Drupal\Core\Routing\MethodFilter::filter
exactly like before.Comment #54
Wim Leers👏 for pushing this one forward again! ❤️
And WOW! YAY! GREEN PATCH! Love the fact that you were able to make virtually no changes to
MethodFilter
.I think the most important thing remaining is profiling? (Besides reviews from the routing system maintainer Tim Plunkett.) Thoughts on how we should do the profiling? Would benchmarking a bunch of URLs (frontpage, node page, REST) instead of profiling be sufficient?
Comment #55
tim.plunkettThis is a bit uglier, but I get it.
This conditional is confusing.
All legacy implementations will pass the first part, and not actually run the applies?
I'd expect it to be something more like
Can't commit this with all these commented out.
😍
Comment #56
dawehner#55
1. If you have a better suggestion, suggest one :)
2. You are absolutely right: 👍
3. They just work, yeah!
4. I couldn't be bothered to adapt the route mocking :)
I'll do some profiling in the meantime ...
@tim.plunkett
In case you are bored: #2849595: Replace \Drupal\Core\Routing\AccessAwareRouter::__call() with the real methods contains another simplification of the routing stack.
Comment #58
dawehnerThis time with actual valid PHP code.
I'm sorry but I just hit some blackfire bug, I'm happy if someone else doesn some profiling. It should result in an actual lower number.
Comment #59
tim.plunkettThis is a BC break of sorts, because applies() is moved from compile-time to runtime.
The trigger_error and deprecation notice do not indicate this.
The only other possibility for #56.1 I see would be to NOT deprecate it, and only make the switch to checking at runtime.
It results in cleaner code, but still a Drupalism.
If that's not preferred, then this is fine.
But we should definitely clarify the change in behavior that exists within the BC layer.
Comment #60
dawehnerCan you elaborate a bit more why this is a BC break? The input and output of the applies calls are still the same from my point of view. I updated the deprecation notice a bit though.
@tim.plunkett
What is your thought about the remaining todo:
Comment #61
tim.plunkettBC break is not quite accurate. But it could be possible that people were lazy and wrote slow crappy code in there knowing it was compile-time only? And now it is run on every route.
Not sure about the @todo yet.
Comment #62
dawehnerAt least for me I could imagine it would have been a problem the other way round aka. relying on runtime information, but they no longer can. In this case they should not really be able to rely on anything? That's just my train of thought.
Comment #63
pwolanin CreditAttribution: pwolanin as a volunteer and at SciShield commentedOverall looks like an improvement, but some small questions / comments
Yay - This combination of service name and tag confused me every time I looked at it.
Why does the Symfony interface need to be aliased here? Becuase the Drupal interface is in the same namespace?
Comment #64
dawehnerExactly :)
Comment #65
Wim LeersHaha, exactly! Very recognizable 😀
So there are only two remaining questions here I think:
applies()
at run time instead of at compile time a BC break? (See #59 + #60 + #61 + #62)Comment #66
dawehnerI still believe nothing could have relied on that actively ...
Comment #67
Wim LeersI benchmarked two cases.
Frontpage:
ab -c 1 -n 100 http://d8/
REST response:
ab -c 1 -n 100 -H 'Authorization: Basic SOMEHASH' http://d8/node/2?_format=hal_json
To me, this is sufficiently reassuring that we're not regressing in a meaningful way, that there are no significant performance changes. If the routing system maintainers want to see more specific data, then they can ask for that.
Comment #68
Wim LeersI agree.
I'd RTBC this patch, but given the above, I think we need a routing system maintainer to RTBC.
Comment #69
Wim LeersAlso, changing some issue metadata:
-> major
-> bug
Comment #70
tim.plunkettLet's just get rid of the @todo. The linked CR is sufficient.
I'll mark this RTBC as soon as that is removed!
Comment #71
dawehnerComment #72
tim.plunkettThanks! While I was about to RTBC I looked at the issue title again.
ClassProvider isn't a thing, I think it meant ClassResolver?
Except we don't actually use that!
Is the new issue title better?
The class resolver isn't actually used!
Should any of these tags have @todo/@deprecated to eventually consolidate theme?
Comment #73
dawehnerSure, let's add a todo for that.
Comment #74
tim.plunkettThanks!
On commit that "Todo" could be made "@todo", but close enough :)
Comment #75
Wim Leers@tim.plunkett Thanks for your attention to detail 👍
Adding the related issue for #72.2/#73.
Comment #76
Wim LeersAlso, 🎉🎉🎉! Can't wait for this to land. This has been blocking #2858482: Simplify REST routing: disallow requesting POST/PATCH in any format, make consistent for 3 months (since #2883680-39: Force all route filters and route enhancers to be non-lazy), which in turn is blocking #2853460: Simplify RequestHandler: make it no longer ContainerAware, split up ::handle(), which in turn is blocking #2737751: Refactor REST routing to address its brittleness. Once this is in, we'll finally be able to land a whole bunch of important REST technical debt ❤️
Thank you so much, Daniel & Tim!
Comment #77
catchShould some of these services be left in and deprecated, except without the tags? Seems academic though, can't imagine a case they'd be used.
Why not inline the logic rather than making protected?
Also I'd prefer to see profiling on here than ab, ab rarely gives useful information on death by a thousand cuts-type changes (which this probably is one way or the other).
Not really keen on exposing the CMF interface directly, especially when we have to alias it. Could we make a new empty core interface and use that everywhere instead?
Comment #78
tim.plunkett1)
I don't see any of these as valuable to leave in, especially the subscribers.
2)
I think the intent was to go for "the most clear diff"? Which I appreciate actually, as someone who reads old commits to derive intent...
Profiling I leave to someone else.
We already have things like Symfony\Cmf\Component\Routing\RouteProviderInterface and Symfony\Cmf\Component\Routing\RouteObjectInterface sprinkled throughout code, I don't think this is a problem. That said, I wouldn't mind reinventing CMF ourselves, last I checked there's not much too it and we had to subclass most of the important stuff...
But, in this case the aliasing only affects classes in the \Drupal\Core\Routing directory, this is the only change other code will have to make.
Comment #79
tim.plunkettAFAIC the only thing left from CMF that we use with no alteration is RouteObjectInterface, and *only* for the ROUTE_NAME/ROUTE_OBJECT constants.
I'd propose creating an empty RouteEnhancerInteface and RouteFilterInterface in Drupal\Core\Routing that extends the CMF ones, but leaves us open to eventually decoupling. The current CR and code change move us *closer* to CMF which is bad.
Comment #80
dawehnerWe explitly have route filters/enhancers not marked as API:
. Maybe we should add route filters explicitely?
To be honest at least as a module author I would prefer to have the services disappear and then actual break my code instead of hiding the problem, by simply not executing code.
At least for me it made it more readable to have this apply method not inline, but on the other hand I was also just lazy.
Yeah I totally agree. Being able to see where things actually improved/got worse is also super valueable.
The problem is that the APIs don't make enforce the Drupal variants at this point in time. The Drupal interfaces have been just needed, in case you actually provided lazy variants.
In case we introduce new interfaces we should though name it different, so its clear its not like the old interfaces with
applies
, but rather completely different. I'm not sure about a good candidate.Its in general really funny how CMF's routing works just completely different to what we do. They basically provide routes per object, so you don't need all this upcasting shizzle we do.
Comment #81
Wim LeersI did benchmarking with
ab
because I know how to pick a common and edge case of routing. To profile this properly, one needs to very thoroughly understand the routing system, because you need to understand the moving parts affected by this patch and the way they are called, in detail.I can take this on, but I'd frankly be more comfortable/have more trust in the profiling results done by somebody who knows the routing system in more detail than I do.
Comment #82
dawehnerNo worries, I'll give it a tty today
Comment #83
dawehnerComparison of
/node/1?_format=json
: https://blackfire.io/profiles/compare/64d9af1b-1d59-4d51-a97d-0597d598c0...Comparision of
<front>
: https://blackfire.io/profiles/compare/cf8a141c-905b-4115-9f02-d053ed4e2d...Overall, we seem to make small gains, which isn't too bad.
Comment #84
catch@dawehner: Thanks for profiling.
This sounds like a good plan to add to the docs.
:) this and smaller diff are both OK explanations. I had to double take on it because on first glance I was "why is this being made protected, how will it get called?" based on earlier discussions in the issue about just calling applies() all the time which is why I brought it up.
@timplunkett
Yes this is where I'm going with it. This doesn't take us from zero to some coupling, but it takes us from some to more when we probably want to move in the other direction medium term.
Comment #85
dawehnerDone
Comment #86
catchOpened #2917331: Decouple from Symfony CMF.
Comment #87
Wim Leers@dawehner: 👌
Comment #88
tim.plunkettIdeally that would be a follow-up issue. But if we put out a CR saying "stop using our RFI and REI and use the ones from CMF" then we're just creating more work for ourselves.
I propose we figure out what to do with only those two interfaces first, and then move onto the rest of the decoupling.
Comment #89
dawehnerEnhancerInterface
andFilterInterface
Comment #90
tim.plunkettAwesome, thanks! Here's some additional cleanup for that latest change.
Signing off on this from the perspective of the Routing maintainer.
Comment #91
dawehnerNice fixes!
Comment #92
dawehnerI'm 100% fine with these changes and would RTBC it. @tim.plunkett are you good with it at this point in time?
Comment #93
larowlanI like the way we made this protected in the revision flavour. I'd be in support of doing that here too. It's more readable. Same in a couple of other places like the field UI one.
Can $format be built from user-supplied data, i.e.
?_format=json
in which case should we use the third arg to in_array here?nit: extra trailing '
Do we need to do profiling here?
Comment #94
Wim LeersFor profiling: see #83.
Comment #95
catchThe new interfaces in #90 look great and just enough to stop us digging a hole and filling it in again, we can/should do any further decoupling in the follow-up.
Comment #96
dawehner#92.1
I agree its more readable to have a method for that.
core/lib/Drupal/Core/Routing/RequestFormatRouteFilter.php
In this example I haven't introduced an applies method due to the tricky logic involved here.#92.2
You never know.
in_array()
with strict TRUE is simply always the better alternative. Let's fix it.#93.3
This just reminds me of https://www.xkcd.com/859/
Comment #97
tim.plunkettLooks great.
Comment #99
tim.plunkett-use Symfony\Component\Routing\Route;
This needs to be added back to EntityRouteEnhancer and FormRouteEnhancer
Comment #100
dawehnerIndeed :)
Comment #102
dawehnerThank you @tim.plunkett for pointing it out for me :)
Comment #103
tim.plunkettOnce more, with feeling
Comment #104
catchCommitted 1cbbff1 and pushed to 8.5.x. Thanks!
Comment #106
Wim LeersUpdated CR metadata & published it: https://www.drupal.org/node/2894934.
This also unblocked #2858482 — see #2858482-41: Simplify REST routing: disallow requesting POST/PATCH in any format, make consistent!
Comment #108
jonathan1055 CreditAttribution: jonathan1055 as a volunteer commentedCouple of questions:
Thanks
Jonathan
Comment #109
almaudoh CreditAttribution: almaudoh commented@jonathan1055: the test fails started when #2870194: Ensure that process-isolated tests can use Symfony's PHPunit bridge to catch usages of deprecated code was committed. That is the issue that activated test failures due to use of deprecated API.
@dawehner: Is there a recommended way of doing this and maintaining backward compatibility with 8.4.x? Simply replacing
class MyRouteEnhancer implements RouteEnhancerInterface {
withclass MyRouteEnhancer implements EnhancerInterface {
will break on 8.4.x since theEnhancerInterface
doesn't yet exist in that branch.Comment #110
jonathan1055 CreditAttribution: jonathan1055 as a volunteer commentedThanks almaudoh. The link to that issue is helpful.
Comment #111
jonathan1055 CreditAttribution: jonathan1055 as a volunteer commentedI am trying to fix an occurrence of the deprecated code in the Rules module, and followed the example in the CR.
However I think there might be an error in the after example for the 'use' statement, because the class
Drupal\Core\Routing\Enhancer\EnhancerInterface
does not exist. I think it should beDrupal\Core\Routing\EnhancerInterface
which does exist and allows my 3rd-party tests which implement Rules conditions and actions to pass again, after failing at 8.5.Apologies for writing to this closed issue, but it seemed the best to get the attention of those who were involved in the CR for this change.
Comment #112
jonathan1055 CreditAttribution: jonathan1055 as a volunteer commentedThis is causing a problem as described in #6 of #2922757-6: Replace deprecated RouteEnhancerInterface, then remove @group legacy where after fixing the code to remove the deprecated class, it runs in 8.5 but fails in 8.4 and 8.3
Fortunately there appears to be a simple solution - just add the two new interface files to 8.4 and 8.3. I have tested this locally and it allows tests to pass at 8.5, 8.4 and 8.3 after switching to the new classes. Here is the patch for 8.4 and 8.3 (not 8.5) and it should pass but won't actually prove anything yet as there are no Core tests in 8.4 and 8.3 which use the new class.
Comment #113
jonathan1055 CreditAttribution: jonathan1055 as a volunteer commentedPlease can a maintainer re-open this issue so that I can test the patch at 8.4.x and maybe even add a new test to cover it. We can't just leave this at 8.5 only. Thanks.
Comment #114
almaudoh CreditAttribution: almaudoh commentedAlso having this same issue at #2922871: Fix test failures in D8.5 due to use of deprecated APIs. Basically, the new interface
Drupal\Core\Routing\EnhancerInterface
needs to exist in D8.4 so contrib can switch to the new API, right now we have a situation where tests fail either in 8.5 or in 8.4Comment #115
jonathan1055 CreditAttribution: jonathan1055 as a volunteer commented@almaudoh,
Can you apply my core patch from 112 locally, and see if this allows your tests to pass at 8.4 and 8.3? It works for me, testing Rules and Scheduler, so I am hopeful it will work for all. But it is always good to get more evidence.
Thanks
Jonathan
Comment #116
jonathan1055 CreditAttribution: jonathan1055 as a volunteer commentedGiven that this issue is closed I have raised #2924899: Backport \Routing\EnhancerInterface to core 8.4 for the backport to 8.4 and 8.3 and uploaded the patch from #112 above to that issue.
Comment #117
Wim Leers#108:
Well-spotted! Created #2926412: Follow-up for #2883680: deprecation message indicates the wrong deprecation introduction version.
Comment #118
jibranIt broke the page_manager module #2918564: Update 'page_manager.variant_route_filter' service according to core changes. Please help with the review/commit so that we can fix it before 8.5.0,
Comment #119
alexpottThis also has broken people's views - see #2959370: View with user/% path breaks login/logout