From 480c3e77d26bb3489230b16bfad60ce2a7843bda Mon Sep 17 00:00:00 2001 From: Nate Brunette Date: Wed, 4 May 2016 13:45:36 -0500 Subject: [PATCH] Adding option to dispatch events from http client adapter Signed-off-by: Nate Brunette --- composer.json | 2 +- composer.lock | 70 ++++++++++--------- src/Adapter/Rest/RestAdapterBuilder.php | 9 ++- src/Event/EventDispatcherAware.php | 25 +++++++ src/Generation/Handler/ResponseHandler.php | 9 ++- tests/Unit/Annotation/BodyTest.php | 10 +++ ...tHeadersDefaultWithBodyThrowsException.php | 3 + .../testResponseAsyncNotOptional.php | 3 - .../generation/testResponseAsyncOptional.php | 3 - 9 files changed, 90 insertions(+), 44 deletions(-) create mode 100644 src/Event/EventDispatcherAware.php create mode 100644 tests/resources/generation/testHeadersDefaultWithBodyThrowsException.php diff --git a/composer.json b/composer.json index 72dce8d..7f2224f 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ }, "require-dev": { "mockery/mockery": "^0.9.4", - "phpunit/phpunit": ">= 4, < 6", + "phpunit/phpunit": "^4.0", "guzzlehttp/guzzle": "^5.3|^6.0", "symfony/symfony": "^3.0", "sensio/framework-extra-bundle": "^3.0.2", diff --git a/composer.lock b/composer.lock index 176fcca..ff48ec1 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "7c1b696b65422ea36906784540fb9471", - "content-hash": "07a7899ab6c8d9e62dc8d0a22ecde236", + "hash": "60bec78db6f20417fe3210e11f8f9fe5", + "content-hash": "4106980137dfcbb1f694abd7fb2a705f", "packages": [ { "name": "doctrine/annotations", @@ -461,16 +461,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "1.2.3", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "2e89629ff057ebb49492ba08e6995d3a6a80021b" + "reference": "31382fef2889136415751badebbd1cb022a4ed72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/2e89629ff057ebb49492ba08e6995d3a6a80021b", - "reference": "2e89629ff057ebb49492ba08e6995d3a6a80021b", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/31382fef2889136415751badebbd1cb022a4ed72", + "reference": "31382fef2889136415751badebbd1cb022a4ed72", "shasum": "" }, "require": { @@ -515,7 +515,7 @@ "stream", "uri" ], - "time": "2016-02-18 21:54:00" + "time": "2016-04-13 19:56:01" }, { "name": "jms/metadata", @@ -1243,16 +1243,16 @@ }, { "name": "symfony/symfony", - "version": "v3.0.4", + "version": "v3.0.5", "source": { "type": "git", "url": "https://github.com/symfony/symfony.git", - "reference": "4e17cb2ecb3fd637097ebeb871fc0e2cbdd5e7ff" + "reference": "10c83b58fbb42be516377de54962a758695ad964" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/symfony/zipball/4e17cb2ecb3fd637097ebeb871fc0e2cbdd5e7ff", - "reference": "4e17cb2ecb3fd637097ebeb871fc0e2cbdd5e7ff", + "url": "https://api.github.com/repos/symfony/symfony/zipball/10c83b58fbb42be516377de54962a758695ad964", + "reference": "10c83b58fbb42be516377de54962a758695ad964", "shasum": "" }, "require": { @@ -1335,7 +1335,11 @@ }, "autoload": { "psr-4": { - "Symfony\\Bridge\\": "src/Symfony/Bridge/", + "Symfony\\Bridge\\Doctrine\\": "src/Symfony/Bridge/Doctrine/", + "Symfony\\Bridge\\Monolog\\": "src/Symfony/Bridge/Monolog/", + "Symfony\\Bridge\\ProxyManager\\": "src/Symfony/Bridge/ProxyManager/", + "Symfony\\Bridge\\Swiftmailer\\": "src/Symfony/Bridge/Swiftmailer/", + "Symfony\\Bridge\\Twig\\": "src/Symfony/Bridge/Twig/", "Symfony\\Bundle\\": "src/Symfony/Bundle/", "Symfony\\Component\\": "src/Symfony/Component/" }, @@ -1365,7 +1369,7 @@ "keywords": [ "framework" ], - "time": "2016-03-30 10:41:14" + "time": "2016-05-03 05:58:56" }, { "name": "tebru/assert", @@ -1461,16 +1465,16 @@ }, { "name": "tebru/retrofit-http-clients", - "version": "v0.6.6", + "version": "v0.6.7", "source": { "type": "git", "url": "https://github.com/tebru/retrofit-http-clients.git", - "reference": "33a02061c5a5f934ef8f1d12cf5051da092205da" + "reference": "ab2452d536f724685403aad8fcaf4f5de0298f63" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tebru/retrofit-http-clients/zipball/33a02061c5a5f934ef8f1d12cf5051da092205da", - "reference": "33a02061c5a5f934ef8f1d12cf5051da092205da", + "url": "https://api.github.com/repos/tebru/retrofit-http-clients/zipball/ab2452d536f724685403aad8fcaf4f5de0298f63", + "reference": "ab2452d536f724685403aad8fcaf4f5de0298f63", "shasum": "" }, "require": { @@ -1498,7 +1502,7 @@ } ], "description": "Retrofit for PHP - A PHP REST client.", - "time": "2016-03-26 00:05:41" + "time": "2016-05-04 18:35:04" }, { "name": "twig/twig", @@ -2017,16 +2021,16 @@ }, { "name": "monolog/monolog", - "version": "1.18.2", + "version": "1.19.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "064b38c16790249488e7a8b987acf1c9d7383c09" + "reference": "5f56ed5212dc509c8dc8caeba2715732abb32dbf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/064b38c16790249488e7a8b987acf1c9d7383c09", - "reference": "064b38c16790249488e7a8b987acf1c9d7383c09", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/5f56ed5212dc509c8dc8caeba2715732abb32dbf", + "reference": "5f56ed5212dc509c8dc8caeba2715732abb32dbf", "shasum": "" }, "require": { @@ -2091,7 +2095,7 @@ "logging", "psr-3" ], - "time": "2016-04-02 13:12:58" + "time": "2016-04-12 18:29:35" }, { "name": "phpdocumentor/reflection-docblock", @@ -2690,16 +2694,16 @@ }, { "name": "sebastian/environment", - "version": "1.3.5", + "version": "1.3.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf" + "reference": "2292b116f43c272ff4328083096114f84ea46a56" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf", - "reference": "dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/2292b116f43c272ff4328083096114f84ea46a56", + "reference": "2292b116f43c272ff4328083096114f84ea46a56", "shasum": "" }, "require": { @@ -2736,7 +2740,7 @@ "environment", "hhvm" ], - "time": "2016-02-26 18:40:46" + "time": "2016-05-04 07:59:13" }, { "name": "sebastian/exporter", @@ -2945,16 +2949,16 @@ }, { "name": "sensio/distribution-bundle", - "version": "v5.0.5", + "version": "v5.0.6", "source": { "type": "git", "url": "https://github.com/sensiolabs/SensioDistributionBundle.git", - "reference": "3a160355bb1364da55ed9e415c1aa1fa8d457b6f" + "reference": "ffe306d09c1f2bad721237f63b2169d1b78253d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/3a160355bb1364da55ed9e415c1aa1fa8d457b6f", - "reference": "3a160355bb1364da55ed9e415c1aa1fa8d457b6f", + "url": "https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/ffe306d09c1f2bad721237f63b2169d1b78253d0", + "reference": "ffe306d09c1f2bad721237f63b2169d1b78253d0", "shasum": "" }, "require": { @@ -2993,7 +2997,7 @@ "configuration", "distribution" ], - "time": "2016-03-15 16:21:41" + "time": "2016-04-25 20:50:31" }, { "name": "sensio/framework-extra-bundle", diff --git a/src/Adapter/Rest/RestAdapterBuilder.php b/src/Adapter/Rest/RestAdapterBuilder.php index 0c0d944..9e142e0 100644 --- a/src/Adapter/Rest/RestAdapterBuilder.php +++ b/src/Adapter/Rest/RestAdapterBuilder.php @@ -15,6 +15,7 @@ use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Tebru; use Tebru\Retrofit\Adapter\HttpClientAdapter; +use Tebru\Retrofit\Event\EventDispatcherAware; use Tebru\Retrofit\Exception\RetrofitException; use Tebru\Retrofit\HttpClient\ClientProvider; use Tebru\Retrofit\Subscriber\LogSubscriber; @@ -230,9 +231,15 @@ public function build() $this->eventDispatcher->addSubscriber(new LogSubscriber($this->logger)); } + $client = $this->clientProvider->getClient(); + + if ($client instanceof EventDispatcherAware) { + $client->setEventDispatcher($this->eventDispatcher); + } + $adapter = new RestAdapter( $this->baseUrl, - $this->clientProvider->getClient(), + $client, $this->serializer, $this->eventDispatcher ); diff --git a/src/Event/EventDispatcherAware.php b/src/Event/EventDispatcherAware.php new file mode 100644 index 0000000..0076553 --- /dev/null +++ b/src/Event/EventDispatcherAware.php @@ -0,0 +1,25 @@ + + */ +interface EventDispatcherAware +{ + /** + * Set a symfony event dispatcher + * + * @param EventDispatcherInterface $eventDispatcher + * @return null + */ + public function setEventDispatcher(EventDispatcherInterface $eventDispatcher); +} diff --git a/src/Generation/Handler/ResponseHandler.php b/src/Generation/Handler/ResponseHandler.php index d611261..7c2f5e0 100644 --- a/src/Generation/Handler/ResponseHandler.php +++ b/src/Generation/Handler/ResponseHandler.php @@ -56,8 +56,11 @@ public function __invoke(HandlerContext $context) $context->body()->add('$exception = $apiExceptionEvent->getException();'); $context->body()->add('throw new \Tebru\Retrofit\Exception\RetrofitApiException(get_class($this), $exception->getMessage(), $exception->getCode(), $exception);'); $context->body()->add('}'); - $context->body()->add('$afterSendEvent = new \Tebru\Retrofit\Event\AfterSendEvent($request, $response);'); - $context->body()->add('$this->eventDispatcher->dispatch("retrofit.afterSend", $afterSendEvent);'); - $context->body()->add('$response = $afterSendEvent->getResponse();'); + + if (null === $callback) { + $context->body()->add('$afterSendEvent = new \Tebru\Retrofit\Event\AfterSendEvent($request, $response);'); + $context->body()->add('$this->eventDispatcher->dispatch("retrofit.afterSend", $afterSendEvent);'); + $context->body()->add('$response = $afterSendEvent->getResponse();'); + } } } diff --git a/tests/Unit/Annotation/BodyTest.php b/tests/Unit/Annotation/BodyTest.php index f90ae85..d47ec18 100644 --- a/tests/Unit/Annotation/BodyTest.php +++ b/tests/Unit/Annotation/BodyTest.php @@ -42,4 +42,14 @@ public function testJsonSerializableIsDeprecated() $body = new Body(['value' => '$body']); $this->assertTrue($body->isJsonSerializable()); } + + public function testJsonSerializable() + { + $this->disableDeprecationWarning(); + + $body = new Body(['value' => '$body', 'jsonSerializable' => true]); + $this->assertTrue($body->isJsonSerializable()); + + $this->enableDeprecationWarning(); + } } diff --git a/tests/resources/generation/testHeadersDefaultWithBodyThrowsException.php b/tests/resources/generation/testHeadersDefaultWithBodyThrowsException.php new file mode 100644 index 0000000..02a17e6 --- /dev/null +++ b/tests/resources/generation/testHeadersDefaultWithBodyThrowsException.php @@ -0,0 +1,3 @@ + 'application/x-www-form-urlencoded'); diff --git a/tests/resources/generation/testResponseAsyncNotOptional.php b/tests/resources/generation/testResponseAsyncNotOptional.php index d1dd5e5..7eb84fc 100644 --- a/tests/resources/generation/testResponseAsyncNotOptional.php +++ b/tests/resources/generation/testResponseAsyncNotOptional.php @@ -12,6 +12,3 @@ $exception = $apiExceptionEvent->getException(); throw new \Tebru\Retrofit\Exception\RetrofitApiException(get_class($this), $exception->getMessage(), $exception->getCode(), $exception); } -$afterSendEvent = new \Tebru\Retrofit\Event\AfterSendEvent($request, $response); -$this->eventDispatcher->dispatch('retrofit.afterSend', $afterSendEvent); -$response = $afterSendEvent->getResponse(); diff --git a/tests/resources/generation/testResponseAsyncOptional.php b/tests/resources/generation/testResponseAsyncOptional.php index b7d9302..235f7e6 100644 --- a/tests/resources/generation/testResponseAsyncOptional.php +++ b/tests/resources/generation/testResponseAsyncOptional.php @@ -16,6 +16,3 @@ $exception = $apiExceptionEvent->getException(); throw new \Tebru\Retrofit\Exception\RetrofitApiException(get_class($this), $exception->getMessage(), $exception->getCode(), $exception); } -$afterSendEvent = new \Tebru\Retrofit\Event\AfterSendEvent($request, $response); -$this->eventDispatcher->dispatch('retrofit.afterSend', $afterSendEvent); -$response = $afterSendEvent->getResponse();