[12.x] Introduce #[Proxy] attribute
#57974
Draft
+211
−8
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.
allow users to mark classes or dependencies which should be built lazily
Building off of @timacdonald's work in #57831
Why would anyone need this
If you've worked in a legacy project, you might've come across junk-drawer service classes that look like this:
When I call
PaymentService@getStripeCustomer(), I am constructing all of the dependencies just to call one of them.In an ideal world, this would be refactored into smaller components with fewer dependencies in each. That's not always a price a development team can pay all at once.
To simplify this, I am proposing introducing a
#[Lazy]attribute, which can be applied to either a class or individual parameters.Naming
Technically this is built using the
proxy()function. I'm not sure that naming the attribute something other than Lazy is worth the distinction.Other ideas
Adding a parameter
bool $dependenciesthat would also make all of the dependencies lazy for the class