diff --git a/src/Illuminate/Container/ContextualBindingBuilder.php b/src/Illuminate/Container/ContextualBindingBuilder.php index c69cede7acd9..5da6ccab388b 100644 --- a/src/Illuminate/Container/ContextualBindingBuilder.php +++ b/src/Illuminate/Container/ContextualBindingBuilder.php @@ -66,4 +66,19 @@ public function give($implementation) $this->container->addContextualBinding($concrete, $this->needs, $implementation); } } + + /** + * Define tagged services to be used as the implementation for the contextual binding. + * + * @param string $tag + * @return void + */ + public function giveTagged($tag) + { + $this->give(function ($container) use ($tag) { + $taggedServices = $container->tagged($tag); + + return is_array($taggedServices) ? $taggedServices : iterator_to_array($taggedServices); + }); + } } diff --git a/tests/Container/ContextualBindingTest.php b/tests/Container/ContextualBindingTest.php index 2e23d770ee71..17a7d73f00ea 100644 --- a/tests/Container/ContextualBindingTest.php +++ b/tests/Container/ContextualBindingTest.php @@ -301,6 +301,64 @@ public function testContextualBindingWorksForVariadicDependenciesWithoutFactory( $this->assertInstanceOf(ContainerContextImplementationStub::class, $resolvedInstance->stubs[0]); $this->assertInstanceOf(ContainerContextImplementationStubTwo::class, $resolvedInstance->stubs[1]); } + + public function testContextualBindingGivesTagsForArrayWithNoTagsDefined() + { + $container = new Container; + + $container->when(ContainerTestContextInjectArray::class)->needs('$stubs')->giveTagged('stub'); + + $resolvedInstance = $container->make(ContainerTestContextInjectArray::class); + + $this->assertCount(0, $resolvedInstance->stubs); + } + + public function testContextualBindingGivesTagsForVariadicWithNoTagsDefined() + { + $container = new Container; + + $container->when(ContainerTestContextInjectVariadic::class)->needs(IContainerContextContractStub::class)->giveTagged('stub'); + + $resolvedInstance = $container->make(ContainerTestContextInjectVariadic::class); + + $this->assertCount(0, $resolvedInstance->stubs); + } + + public function testContextualBindingGivesTagsForArray() + { + $container = new Container; + + $container->tag([ + ContainerContextImplementationStub::class, + ContainerContextImplementationStubTwo::class, + ], ['stub']); + + $container->when(ContainerTestContextInjectArray::class)->needs('$stubs')->giveTagged('stub'); + + $resolvedInstance = $container->make(ContainerTestContextInjectArray::class); + + $this->assertCount(2, $resolvedInstance->stubs); + $this->assertInstanceOf(ContainerContextImplementationStub::class, $resolvedInstance->stubs[0]); + $this->assertInstanceOf(ContainerContextImplementationStubTwo::class, $resolvedInstance->stubs[1]); + } + + public function testContextualBindingGivesTagsForVariadic() + { + $container = new Container; + + $container->tag([ + ContainerContextImplementationStub::class, + ContainerContextImplementationStubTwo::class, + ], ['stub']); + + $container->when(ContainerTestContextInjectVariadic::class)->needs(IContainerContextContractStub::class)->giveTagged('stub'); + + $resolvedInstance = $container->make(ContainerTestContextInjectVariadic::class); + + $this->assertCount(2, $resolvedInstance->stubs); + $this->assertInstanceOf(ContainerContextImplementationStub::class, $resolvedInstance->stubs[0]); + $this->assertInstanceOf(ContainerContextImplementationStubTwo::class, $resolvedInstance->stubs[1]); + } } interface IContainerContextContractStub @@ -385,6 +443,16 @@ public function __construct(ContainerTestContextInjectOne $inner = null) } } +class ContainerTestContextInjectArray +{ + public $stubs; + + public function __construct(array $stubs) + { + $this->stubs = $stubs; + } +} + class ContainerTestContextInjectVariadic { public $stubs;