diff --git a/Tests/DependencyInjection/Compiler/Builder/DefinitionBuilderTest.php b/Tests/DependencyInjection/Compiler/Builder/DefinitionBuilderTest.php index 8fb2878..8c9d684 100644 --- a/Tests/DependencyInjection/Compiler/Builder/DefinitionBuilderTest.php +++ b/Tests/DependencyInjection/Compiler/Builder/DefinitionBuilderTest.php @@ -40,7 +40,8 @@ public function testGetHandlerDefinition() $container = $this->prophesize(ContainerBuilder::class); $middleware = ['test_middleware' => [ - ['method' => 'attach'] + ['method' => 'attach'], + ['method' => 'attach2'], ]]; $handler = $this->subject->getHandlerDefinition($container->reveal(), $clientName, $middleware); @@ -51,7 +52,7 @@ public function testGetHandlerDefinition() $methodCalls = $handler->getMethodCalls(); // Count is the number of the given middleware + the default event and log middleware expressions - $this->assertCount(3, $methodCalls); + $this->assertCount(4, $methodCalls); $customMiddlewareCall = array_shift($methodCalls); $this->assertSame('push', array_shift($customMiddlewareCall)); @@ -61,6 +62,14 @@ public function testGetHandlerDefinition() $this->assertInstanceOf(Expression::class, $customMiddlewareExpression); $this->assertSame('service("test_middleware").attach()', $customMiddlewareExpression->__toString()); + $customMiddlewareCall = array_shift($methodCalls); + $this->assertSame('push', array_shift($customMiddlewareCall)); + /** @var Expression[] $customMiddlewareExpressions */ + $customMiddlewareExpressions = array_shift($customMiddlewareCall); + $customMiddlewareExpression = array_shift($customMiddlewareExpressions); + $this->assertInstanceOf(Expression::class, $customMiddlewareExpression); + $this->assertSame('service("test_middleware").attach2()', $customMiddlewareExpression->__toString()); + $logMiddlewareCall = array_shift($methodCalls); $this->assertSame('push', array_shift($logMiddlewareCall)); /** @var Expression[] $logMiddlewareExpressions */ diff --git a/Tests/DependencyInjection/Compiler/Filter/MiddlewareFilterTest.php b/Tests/DependencyInjection/Compiler/Filter/MiddlewareFilterTest.php index b9c5b90..4a0885a 100644 --- a/Tests/DependencyInjection/Compiler/Filter/MiddlewareFilterTest.php +++ b/Tests/DependencyInjection/Compiler/Filter/MiddlewareFilterTest.php @@ -1,4 +1,5 @@ [ + [ + 'name' => 'guzzle.middleware', + 'method' => 'addMiddlewareStuff', + 'client' => 'test_client' + ], + [ + 'name' => 'guzzle.middleware', + 'method' => 'addOtherMiddlewareStuff', + 'client' => 'test_client' + ] + ] + ] + ], + [ + $middleware, + 'test_client2', + [ + 'guzzle.middleware.stuff' => [ + [ + 'name' => 'guzzle.middleware', + 'method' => 'addMiddlewareStuff', + 'client' => 'test_client2' + ] + ] + ] + ], [$middleware, 'false_client', []], ]; } diff --git a/Tests/Resources/config/sample_middleware.yml b/Tests/Resources/config/sample_middleware.yml index 666b9bc..ef9c83c 100644 --- a/Tests/Resources/config/sample_middleware.yml +++ b/Tests/Resources/config/sample_middleware.yml @@ -3,4 +3,3 @@ services: guzzle.middleware.stuff: tags: - { name: guzzle.middleware, method: addMiddlewareStuff, client: test_client } - diff --git a/Tests/Resources/config/sample_multiple_middleware.yml b/Tests/Resources/config/sample_multiple_middleware.yml new file mode 100644 index 0000000..cd453c2 --- /dev/null +++ b/Tests/Resources/config/sample_multiple_middleware.yml @@ -0,0 +1,8 @@ +# This file shows a sample middleware configuration for the guzzle library +services: + guzzle.middleware.stuff: + tags: + - { name: guzzle.middleware, method: addMiddlewareStuff, client: test_client } + - { name: guzzle.middleware, method: addOtherMiddlewareStuff, client: test_client } + - { name: guzzle.middleware, method: addMiddlewareStuff, client: test_client2 } + diff --git a/src/DependencyInjection/Compiler/Builder/DefinitionBuilder.php b/src/DependencyInjection/Compiler/Builder/DefinitionBuilder.php index ad7cd5b..b76ca92 100644 --- a/src/DependencyInjection/Compiler/Builder/DefinitionBuilder.php +++ b/src/DependencyInjection/Compiler/Builder/DefinitionBuilder.php @@ -35,14 +35,14 @@ public function getHandlerDefinition( $handler->setFactory(['%guzzle_http.handler_stack.class%', 'create']); foreach ($middleware as $id => $tags) { - $attributes = reset($tags); - - if (!empty($attributes['method'])) { - $middlewareExpression = new Expression(sprintf('service("%s").%s()', $id, $attributes['method'])); - } else { - $middlewareExpression = new Expression(sprintf('service("%s")', $id)); + foreach ($tags as $attributes) { + if (!empty($attributes['method'])) { + $middlewareExpression = new Expression(sprintf('service("%s").%s()', $id, $attributes['method'])); + } else { + $middlewareExpression = new Expression(sprintf('service("%s")', $id)); + } + $handler->addMethodCall('push', [$middlewareExpression]); } - $handler->addMethodCall('push', [$middlewareExpression]); } $eventServiceName = sprintf('guzzle_bundle.middleware.event_dispatch.%s', $clientName); diff --git a/src/DependencyInjection/Compiler/Filter/MiddlewareFilter.php b/src/DependencyInjection/Compiler/Filter/MiddlewareFilter.php index b79ee79..fa90354 100644 --- a/src/DependencyInjection/Compiler/Filter/MiddlewareFilter.php +++ b/src/DependencyInjection/Compiler/Filter/MiddlewareFilter.php @@ -28,10 +28,16 @@ class MiddlewareFilter */ public function filter(ContainerBuilder $container, string $clientName): array { - $middleware = $container->findTaggedServiceIds('guzzle.middleware'); - return array_filter($middleware, function ($middleware) use ($clientName) { - $options = reset($middleware); - return !array_key_exists('client', $options) || $clientName === $options['client']; - }); + $middleware = []; + + foreach ($container->findTaggedServiceIds('guzzle.middleware') as $service => $tags) { + foreach ($tags as $options) { + if (!array_key_exists('client', $options) || $clientName === $options['client']) { + $middleware[$service][] = $options; + } + } + } + + return $middleware; } }