From 983207fb9a113831261943c691905a1ec1c30541 Mon Sep 17 00:00:00 2001 From: Marcus Speight Date: Mon, 30 Oct 2017 13:42:22 +0000 Subject: [PATCH 1/2] Support multiple tags on middleware --- .../Builder/DefinitionBuilderTest.php | 13 ++++++- .../Compiler/Filter/MiddlewareFilterTest.php | 37 +++++++++++++++++-- Tests/Resources/config/sample_config.yml | 2 + Tests/Resources/config/sample_middleware.yml | 2 + .../Compiler/Builder/DefinitionBuilder.php | 14 +++---- .../Compiler/Filter/MiddlewareFilter.php | 16 +++++--- 6 files changed, 67 insertions(+), 17 deletions(-) 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..ea36ee5 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_config.yml b/Tests/Resources/config/sample_config.yml index 86a547c..01fb0da 100644 --- a/Tests/Resources/config/sample_config.yml +++ b/Tests/Resources/config/sample_config.yml @@ -33,3 +33,5 @@ guzzle: verify: true timeout: 5 version: 1.1 + test_client2: + base_uri: 'https://example.com/path' diff --git a/Tests/Resources/config/sample_middleware.yml b/Tests/Resources/config/sample_middleware.yml index 666b9bc..cd453c2 100644 --- a/Tests/Resources/config/sample_middleware.yml +++ b/Tests/Resources/config/sample_middleware.yml @@ -3,4 +3,6 @@ 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; } } From 79ab6564b03251c9c48b2d68e57cd4772fc5a730 Mon Sep 17 00:00:00 2001 From: Marcus Speight Date: Mon, 30 Oct 2017 14:06:27 +0000 Subject: [PATCH 2/2] Fixed failing tests by moving new test config to separate file. --- .../Compiler/Filter/MiddlewareFilterTest.php | 2 +- Tests/Resources/config/sample_config.yml | 2 -- Tests/Resources/config/sample_middleware.yml | 3 --- Tests/Resources/config/sample_multiple_middleware.yml | 8 ++++++++ 4 files changed, 9 insertions(+), 6 deletions(-) create mode 100644 Tests/Resources/config/sample_multiple_middleware.yml diff --git a/Tests/DependencyInjection/Compiler/Filter/MiddlewareFilterTest.php b/Tests/DependencyInjection/Compiler/Filter/MiddlewareFilterTest.php index ea36ee5..4a0885a 100644 --- a/Tests/DependencyInjection/Compiler/Filter/MiddlewareFilterTest.php +++ b/Tests/DependencyInjection/Compiler/Filter/MiddlewareFilterTest.php @@ -55,7 +55,7 @@ public function testFilter(array $middleware, string $clientName, array $expecte public function dataProviderFilter(): array { $parsedMiddleware = Yaml::parse( - file_get_contents(__DIR__ . '/../../../Resources/config/sample_middleware.yml') + file_get_contents(__DIR__ . '/../../../Resources/config/sample_multiple_middleware.yml') )['services']; $middleware = []; diff --git a/Tests/Resources/config/sample_config.yml b/Tests/Resources/config/sample_config.yml index 01fb0da..86a547c 100644 --- a/Tests/Resources/config/sample_config.yml +++ b/Tests/Resources/config/sample_config.yml @@ -33,5 +33,3 @@ guzzle: verify: true timeout: 5 version: 1.1 - test_client2: - base_uri: 'https://example.com/path' diff --git a/Tests/Resources/config/sample_middleware.yml b/Tests/Resources/config/sample_middleware.yml index cd453c2..ef9c83c 100644 --- a/Tests/Resources/config/sample_middleware.yml +++ b/Tests/Resources/config/sample_middleware.yml @@ -3,6 +3,3 @@ 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/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 } +