[DependencyInjection] Fix #[AutowireCallable] sometimes incorrectly inlined
#62755
+160
−2
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.
When using a combination of
#[AutowireCallable]and a service locator, services may be incorrectly inlined, resulting in a broken compiled container. For example, before and after the fix (namespaces removed for readability):/** * Gets the private 'Listener1' shared autowired service. * * @return \Listener1 */ protected static function getListener1Service($container) { - return $container->privates['Listener1'] = new \Listener1(($container->services['MyInlineService'] ?? $container->get('MyInlineService'))->someMethod1(...)); + return $container->privates['Listener1'] = new \Listener1(($container->privates['MyInlineService'] ??= new \MyInlineService())->someMethod1(...)); } /** * Gets the private 'Listener2' shared autowired service. * * @return \Listener2 */ protected static function getListener2Service($container) { - return $container->privates['Listener2'] = new \Listener2((new \MyInlineService())->someMethod1(...), new \stdClass()); + return $container->privates['Listener2'] = new \Listener2(($container->privates['MyInlineService'] ??= new \MyInlineService())->someMethod2(...), new \stdClass()); }The
getListener1Service()method was broken because$container->get('MyInlineService')throws an exception:The issue is not present in 6.4.