[5.4] Use Instance instead of Deferred Provider #20714
Merged
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 calling app()->instance('foo','bar'), if there's a deferred service provider registered for class foo,
the deferred provider gets called and overrides the instance that was just set. This means that if you have
app()->bind('foo','foo); // in a deferred service provider
and you run the following as the first reference to 'foo'
app()->instance('foo','bar');
$instance = app()->make('foo');
$instance = 'foo' instead of 'bar'
Added an additional condition to Application->make to check to see if an instance for that $abstract as already been set and skip loading the deferred provider if it does.
This issue tends to crop up most when writing tests, since the call to app()->instance is likely the first time the container will have to resolve the binding and overriding a binding with a particular instance of a Mock is common.