[DependencyInjection] Deprecate TraitGetByTypeToInjectRector - #1002
Merged
Conversation
A trait has no context about the class it is used in, so the $this->get() call cannot be safely resolved to a constructor/autowired injection. The rule was built for a single custom project and does not generalize. Also removes the now-unused AutowireClassMethodFactory and drops the rule from the symfony-constructor-injection set.
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.
TraitGetByTypeToInjectRectorturned$this->get(SomeType::class)inside a trait into a@requiredautowired method:trait SomeInjects { + private SomeType $someType; + + /** + * @required + */ + public function autowireSomeInjects(SomeType $someType): void + { + $this->someType = $someType; + } + public function someMethod() { - return $this->get(SomeType::class); + return $this->someType; } }Why deprecate
A trait has no context about the class it ends up in.
$this->get()is only valid when the trait is used inside an old container-awareController/Command, and the rule cannot verify that — it rewrites any trait with aget()call. The generated@requiredmethod also only works in a Symfony DI-managed service, which again is unknowable from the trait alone.The rule was written for one custom project and does not generalize. The class-based siblings (
ControllerGetByTypeToConstructorInjectionRector,CommandGetByTypeToConstructorInjectionRector,GetBySymfonyStringToConstructorInjectionRector) do have that context and stay.Changes
DeprecatedInterface,refactor()throwssymfony-constructor-injectionsetAutowireClassMethodFactoryremoved — it had no other consumer