From 2d3bc8db2fd9cf85308aa7f7259f3e9fbd2a33a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A1gi-Kaz=C3=A1r=20M=C3=A1rk?= Date: Fri, 25 Dec 2015 21:37:40 +0100 Subject: [PATCH] Use Puli discovery Add Puli CLI as dev dependency Replace actual implementations with mocks Update Change Log --- .gitignore | 2 + CHANGELOG.md | 7 ++ composer.json | 20 +-- spec/ClassDiscoverySpec.php | 170 +++++++------------------- spec/HttpAsyncClientDiscoverySpec.php | 31 ++++- spec/HttpClientDiscoverySpec.php | 31 ++++- spec/MessageFactoryDiscoverySpec.php | 36 ++++-- spec/StreamFactoryDiscoverySpec.php | 36 ++++-- spec/Stub/HttpAsyncClientStub.php | 13 ++ spec/Stub/HttpClientStub.php | 13 ++ spec/Stub/MessageFactoryStub.php | 26 ++++ spec/Stub/StreamFactoryStub.php | 12 ++ spec/Stub/UriFactoryStub.php | 12 ++ spec/UriFactoryDiscoverySpec.php | 36 ++++-- src/ClassDiscovery.php | 116 ++++++++++++++---- src/FactoryDiscovery.php | 27 ---- src/HttpAsyncClientDiscovery.php | 22 +--- src/HttpClientDiscovery.php | 26 +--- src/MessageFactoryDiscovery.php | 42 ++----- src/StreamFactoryDiscovery.php | 42 ++----- src/UriFactoryDiscovery.php | 40 ++---- 21 files changed, 422 insertions(+), 338 deletions(-) create mode 100644 spec/Stub/HttpAsyncClientStub.php create mode 100644 spec/Stub/HttpClientStub.php create mode 100644 spec/Stub/MessageFactoryStub.php create mode 100644 spec/Stub/StreamFactoryStub.php create mode 100644 spec/Stub/UriFactoryStub.php delete mode 100644 src/FactoryDiscovery.php diff --git a/.gitignore b/.gitignore index 7608c4b..97015cb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ +.puli/ build/ vendor/ composer.lock phpspec.yml phpunit.xml +puli.json diff --git a/CHANGELOG.md b/CHANGELOG.md index e692683..6a4cfe9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ # Change Log +## Unreleased + +### Changed + +- Use [Puli](http://puli.io) for discovery + + ## 0.5.0 - 2015-12-25 ### Changed diff --git a/composer.json b/composer.json index 4f1d5f9..031e3b4 100644 --- a/composer.json +++ b/composer.json @@ -16,31 +16,33 @@ ], "require": { "php": ">=5.4", - "php-http/message-factory": "^1.0" + "puli/composer-plugin": "1.0.0-beta8", + "puli/discovery": "1.0.0-beta8" }, "require-dev": { - "php-http/message": "^0.1", - "zendframework/zend-diactoros": "^1.0", - "guzzlehttp/psr7": "^1.0", - "php-http/guzzle6-adapter": "^0.2", + "php-http/httplug": "1.0.0-beta", + "php-http/message-factory": "^1.0", + "puli/cli": "1.0.0-beta9", "phpspec/phpspec": "^2.4", "henrikbjorn/phpspec-code-coverage" : "^1.0" }, - "suggest": { - "php-http/utils": "To use Guzzle or Diactoros factories" - }, "autoload": { "psr-4": { "Http\\Discovery\\": "src/" } }, + "autoload-dev": { + "psr-4": { + "spec\\Http\\Discovery\\": "spec/" + } + }, "scripts": { "test": "vendor/bin/phpspec run", "test-ci": "vendor/bin/phpspec run -c phpspec.yml.ci" }, "extra": { "branch-alias": { - "dev-master": "0.5-dev" + "dev-master": "0.6-dev" } }, "prefer-stable": true, diff --git a/spec/ClassDiscoverySpec.php b/spec/ClassDiscoverySpec.php index 75304b9..08dece2 100644 --- a/spec/ClassDiscoverySpec.php +++ b/spec/ClassDiscoverySpec.php @@ -3,163 +3,83 @@ namespace spec\Http\Discovery; use Http\Discovery\ClassDiscovery; +use Puli\Discovery\Binding\ClassBinding; +use Puli\GeneratedPuliFactory; +use Puli\Discovery\Api\Discovery; +use Puli\Repository\Api\ResourceRepository; use PhpSpec\ObjectBehavior; class ClassDiscoverySpec extends ObjectBehavior { - function let() - { - $this->beAnInstanceOf('spec\Http\Discovery\DiscoveryStub'); + function let( + GeneratedPuliFactory $puliFactory, + ResourceRepository $repository, + Discovery $discovery + ) { + $puliFactory->createRepository()->willReturn($repository); + $puliFactory->createDiscovery($repository)->willReturn($discovery); + + $this->beAnInstanceOf('spec\Http\Discovery\ClassDiscoveryStub'); + $this->setPuliFactory($puliFactory); } - function it_is_initializable() + function letgo() { - $this->shouldHaveType('Http\Discovery\ClassDiscovery'); + $this->resetPuliFactory(); } - function it_registers_a_class() + function it_is_initializable() { - $this->reset(); - - $this->register('spec\Http\Discovery\AnotherClassToFind'); - - $this->find()->shouldHaveType('spec\Http\Discovery\AnotherClassToFind'); + $this->shouldHaveType('Http\Discovery\ClassDiscovery'); } - function it_registers_a_class_with_a_condition() + function it_has_a_puli_factory(GeneratedPuliFactory $puliFactory) { - $this->reset(); - - $this->register('spec\Http\Discovery\AnotherClassToFind', 'spec\Http\Discovery\TestClass'); - $this->register('spec\Http\Discovery\ClassToFind', false); - - $this->find()->shouldHaveType('spec\Http\Discovery\AnotherClassToFind'); + $this->getPuliFactory()->shouldReturn($puliFactory); } - function it_registers_a_class_with_a_callable_condition() + function it_has_a_puli_discovery(Discovery $discovery) { - $this->reset(); - - $this->register('spec\Http\Discovery\AnotherClassToFind', function() { return true; }); - $this->register('spec\Http\Discovery\ClassToFind', false); - - $this->find()->shouldHaveType('spec\Http\Discovery\AnotherClassToFind'); + $this->getPuliDiscovery()->shouldReturn($discovery); } - function it_registers_a_class_with_a_boolean_condition() + function it_throws_an_exception_when_binding_not_found(Discovery $discovery) { - $this->reset(); - - $this->register('spec\Http\Discovery\AnotherClassToFind', true); - $this->register('spec\Http\Discovery\ClassToFind', false); + $discovery->findBindings('InvalidBinding')->willReturn([]); - $this->find()->shouldHaveType('spec\Http\Discovery\AnotherClassToFind'); - } - - function it_registers_a_class_with_an_array_condition() - { - $this->reset(); - - $this->register( - 'spec\Http\Discovery\AnotherClassToFind', - [ - true, - 'spec\Http\Discovery\AnotherClassToFind', - ] - ); - $this->register( - 'spec\Http\Discovery\ClassToFind', - [ - false, - 'spec\Http\Discovery\ClassToFind', - ] - ); - - $this->find()->shouldHaveType('spec\Http\Discovery\AnotherClassToFind'); + $this->shouldThrow('Http\Discovery\NotFoundException')->duringFindOneByType('InvalidBinding'); } - function it_registers_a_class_with_an_invalid_condition() + function it_returns_a_class_binding(Discovery $discovery, ClassBinding $binding) { - $this->reset(); + $binding->hasParameterValue('depends')->willReturn(false); + $binding->getClassName()->willReturn('ClassName'); - $this->register('spec\Http\Discovery\AnotherClassToFind', true); - $this->register('spec\Http\Discovery\ClassToFind', new \stdClass); + $discovery->findBindings('Binding')->willReturn([$binding]); - $this->find()->shouldHaveType('spec\Http\Discovery\AnotherClassToFind'); + $this->findOneByType('Binding')->shouldReturn('ClassName'); } - function it_resets_cache_when_a_class_is_registered() - { - $this->reset(); + function it_returns_a_class_binding_with_dependency( + Discovery $discovery, + ClassBinding $binding1, + ClassBinding $binding2 + ) { + $binding1->hasParameterValue('depends')->willReturn(true); + $binding1->getParameterValue('depends')->willReturn(false); - $this->find()->shouldHaveType('spec\Http\Discovery\ClassToFind'); + $binding2->hasParameterValue('depends')->willReturn(false); + $binding2->getClassName()->willReturn('ClassName'); - $this->register('spec\Http\Discovery\AnotherClassToFind'); + $discovery->findBindings('Binding')->willReturn([ + $binding1, + $binding2, + ]); - $this->find()->shouldHaveType('spec\Http\Discovery\AnotherClassToFind'); - } - - function it_caches_a_found_class() - { - $this->reset(); - - $this->find()->shouldHaveType('spec\Http\Discovery\ClassToFind'); - - $this->registerWithoutCacheReset('spec\Http\Discovery\AnotherClassToFind'); - - $this->find()->shouldhaveType('spec\Http\Discovery\ClassToFind'); - } - - function it_throws_an_exception_when_no_class_is_found() - { - $this->resetEmpty(); - - $this->shouldThrow('Http\Discovery\NotFoundException')->duringFind(); + $this->findOneByType('Binding')->shouldReturn('ClassName'); } } -class DiscoveryStub extends ClassDiscovery +class ClassDiscoveryStub extends ClassDiscovery { - protected static $cache; - - /** - * @var array - */ - protected static $classes; - - /** - * Reset classes - */ - public function reset() - { - static::$cache = null; - - static::$classes = [ - [ - 'class' => 'spec\Http\Discovery\ClassToFind', - 'condition' => 'spec\Http\Discovery\ClassToFind' - ], - ]; - } - - public function registerWithoutCacheReset($class, $condition = null) - { - $definition = [ - 'class' => $class, - 'condition' => isset($condition) ? $condition : $class, - ]; - - array_unshift(static::$classes, $definition); - } - - public function resetEmpty() - { - static::$cache = null; - - static::$classes = []; - } } - -class ClassToFind {} -class AnotherClassToFind {} -class TestClass {} diff --git a/spec/HttpAsyncClientDiscoverySpec.php b/spec/HttpAsyncClientDiscoverySpec.php index 9e4a703..438cd4d 100644 --- a/spec/HttpAsyncClientDiscoverySpec.php +++ b/spec/HttpAsyncClientDiscoverySpec.php @@ -2,10 +2,30 @@ namespace spec\Http\Discovery; +use Puli\GeneratedPuliFactory; +use Puli\Discovery\Api\Discovery; +use Puli\Discovery\Binding\ClassBinding; +use Puli\Repository\Api\ResourceRepository; use PhpSpec\ObjectBehavior; class HttpAsyncClientDiscoverySpec extends ObjectBehavior { + function let( + GeneratedPuliFactory $puliFactory, + ResourceRepository $repository, + Discovery $discovery + ) { + $puliFactory->createRepository()->willReturn($repository); + $puliFactory->createDiscovery($repository)->willReturn($discovery); + + $this->setPuliFactory($puliFactory); + } + + function letgo() + { + $this->resetPuliFactory(); + } + function it_is_initializable() { $this->shouldHaveType('Http\Discovery\HttpAsyncClientDiscovery'); @@ -16,8 +36,15 @@ function it_is_a_class_discovery() $this->shouldHaveType('Http\Discovery\ClassDiscovery'); } - function it_finds_an_http_client() - { + function it_finds_an_async_http_client( + Discovery $discovery, + ClassBinding $binding + ) { + $binding->hasParameterValue('depends')->willReturn(false); + $binding->getClassName()->willReturn('spec\Http\Discovery\Stub\HttpAsyncClientStub'); + + $discovery->findBindings('Http\Client\HttpAsyncClient')->willReturn([$binding]); + $this->find()->shouldImplement('Http\Client\HttpAsyncClient'); } } diff --git a/spec/HttpClientDiscoverySpec.php b/spec/HttpClientDiscoverySpec.php index c8a3e9f..2ecc873 100644 --- a/spec/HttpClientDiscoverySpec.php +++ b/spec/HttpClientDiscoverySpec.php @@ -2,10 +2,30 @@ namespace spec\Http\Discovery; +use Puli\GeneratedPuliFactory; +use Puli\Discovery\Api\Discovery; +use Puli\Discovery\Binding\ClassBinding; +use Puli\Repository\Api\ResourceRepository; use PhpSpec\ObjectBehavior; class HttpClientDiscoverySpec extends ObjectBehavior { + function let( + GeneratedPuliFactory $puliFactory, + ResourceRepository $repository, + Discovery $discovery + ) { + $puliFactory->createRepository()->willReturn($repository); + $puliFactory->createDiscovery($repository)->willReturn($discovery); + + $this->setPuliFactory($puliFactory); + } + + function letgo() + { + $this->resetPuliFactory(); + } + function it_is_initializable() { $this->shouldHaveType('Http\Discovery\HttpClientDiscovery'); @@ -16,8 +36,15 @@ function it_is_a_class_discovery() $this->shouldHaveType('Http\Discovery\ClassDiscovery'); } - function it_finds_an_http_client() - { + function it_finds_an_http_client( + Discovery $discovery, + ClassBinding $binding + ) { + $binding->hasParameterValue('depends')->willReturn(false); + $binding->getClassName()->willReturn('spec\Http\Discovery\Stub\HttpClientStub'); + + $discovery->findBindings('Http\Client\HttpClient')->willReturn([$binding]); + $this->find()->shouldImplement('Http\Client\HttpClient'); } } diff --git a/spec/MessageFactoryDiscoverySpec.php b/spec/MessageFactoryDiscoverySpec.php index c806d26..120526f 100644 --- a/spec/MessageFactoryDiscoverySpec.php +++ b/spec/MessageFactoryDiscoverySpec.php @@ -2,10 +2,30 @@ namespace spec\Http\Discovery; +use Puli\GeneratedPuliFactory; +use Puli\Discovery\Api\Discovery; +use Puli\Discovery\Binding\ClassBinding; +use Puli\Repository\Api\ResourceRepository; use PhpSpec\ObjectBehavior; class MessageFactoryDiscoverySpec extends ObjectBehavior { + function let( + GeneratedPuliFactory $puliFactory, + ResourceRepository $repository, + Discovery $discovery + ) { + $puliFactory->createRepository()->willReturn($repository); + $puliFactory->createDiscovery($repository)->willReturn($discovery); + + $this->setPuliFactory($puliFactory); + } + + function letgo() + { + $this->resetPuliFactory(); + } + function it_is_initializable() { $this->shouldHaveType('Http\Discovery\MessageFactoryDiscovery'); @@ -16,13 +36,15 @@ function it_is_a_class_discovery() $this->shouldHaveType('Http\Discovery\ClassDiscovery'); } - function it_is_a_factory_discovery() - { - $this->shouldHaveType('Http\Discovery\FactoryDiscovery'); - } + function it_finds_a_message_factory( + Discovery $discovery, + ClassBinding $binding + ) { + $binding->hasParameterValue('depends')->willReturn(false); + $binding->getClassName()->willReturn('spec\Http\Discovery\Stub\MessageFactoryStub'); - function it_finds_an_http_message_factory() - { - $this->find()->shouldHaveType('Http\Message\MessageFactory'); + $discovery->findBindings('Http\Message\MessageFactory')->willReturn([$binding]); + + $this->find()->shouldImplement('Http\Message\MessageFactory'); } } diff --git a/spec/StreamFactoryDiscoverySpec.php b/spec/StreamFactoryDiscoverySpec.php index 7c5e9f3..3e3aa1a 100644 --- a/spec/StreamFactoryDiscoverySpec.php +++ b/spec/StreamFactoryDiscoverySpec.php @@ -2,10 +2,30 @@ namespace spec\Http\Discovery; +use Puli\GeneratedPuliFactory; +use Puli\Discovery\Api\Discovery; +use Puli\Discovery\Binding\ClassBinding; +use Puli\Repository\Api\ResourceRepository; use PhpSpec\ObjectBehavior; class StreamFactoryDiscoverySpec extends ObjectBehavior { + function let( + GeneratedPuliFactory $puliFactory, + ResourceRepository $repository, + Discovery $discovery + ) { + $puliFactory->createRepository()->willReturn($repository); + $puliFactory->createDiscovery($repository)->willReturn($discovery); + + $this->setPuliFactory($puliFactory); + } + + function letgo() + { + $this->resetPuliFactory(); + } + function it_is_initializable() { $this->shouldHaveType('Http\Discovery\StreamFactoryDiscovery'); @@ -16,13 +36,15 @@ function it_is_a_class_discovery() $this->shouldHaveType('Http\Discovery\ClassDiscovery'); } - function it_is_a_factory_discovery() - { - $this->shouldHaveType('Http\Discovery\FactoryDiscovery'); - } + function it_finds_a_stream_factory( + Discovery $discovery, + ClassBinding $binding + ) { + $binding->hasParameterValue('depends')->willReturn(false); + $binding->getClassName()->willReturn('spec\Http\Discovery\Stub\StreamFactoryStub'); - function it_finds_an_http_stream_factory() - { - $this->find()->shouldHaveType('Http\Message\StreamFactory'); + $discovery->findBindings('Http\Message\StreamFactory')->willReturn([$binding]); + + $this->find()->shouldImplement('Http\Message\StreamFactory'); } } diff --git a/spec/Stub/HttpAsyncClientStub.php b/spec/Stub/HttpAsyncClientStub.php new file mode 100644 index 0000000..505b3ce --- /dev/null +++ b/spec/Stub/HttpAsyncClientStub.php @@ -0,0 +1,13 @@ +createRepository()->willReturn($repository); + $puliFactory->createDiscovery($repository)->willReturn($discovery); + + $this->setPuliFactory($puliFactory); + } + + function letgo() + { + $this->resetPuliFactory(); + } + function it_is_initializable() { $this->shouldHaveType('Http\Discovery\UriFactoryDiscovery'); @@ -16,13 +36,15 @@ function it_is_a_class_discovery() $this->shouldHaveType('Http\Discovery\ClassDiscovery'); } - function it_is_a_factory_discovery() - { - $this->shouldHaveType('Http\Discovery\FactoryDiscovery'); - } + function it_finds_a_uri_factory( + Discovery $discovery, + ClassBinding $binding + ) { + $binding->hasParameterValue('depends')->willReturn(false); + $binding->getClassName()->willReturn('spec\Http\Discovery\Stub\UriFactoryStub'); - function it_finds_an_http_uri_factory() - { - $this->find()->shouldHaveType('Http\Message\UriFactory'); + $discovery->findBindings('Http\Message\UriFactory')->willReturn([$binding]); + + $this->find()->shouldImplement('Http\Message\UriFactory'); } } diff --git a/src/ClassDiscovery.php b/src/ClassDiscovery.php index 2b1e313..1bd62e7 100644 --- a/src/ClassDiscovery.php +++ b/src/ClassDiscovery.php @@ -2,54 +2,126 @@ namespace Http\Discovery; +use Puli\Discovery\Api\Discovery; + /** * Registry that based find results on class existence. * * @author David de Boer + * @author Márk Sági-Kazár */ abstract class ClassDiscovery { /** - * Add a class (and condition) to the discovery registry. + * @var GeneratedPuliFactory + */ + private static $puliFactory; + + /** + * @var Discovery + */ + private static $puliDiscovery; + + /** + * @return GeneratedPuliFactory + */ + public static function getPuliFactory() + { + if (null === self::$puliFactory) { + if (!defined('PULI_FACTORY_CLASS')) { + throw new \RuntimeException('Puli Factory is not available'); + } + + $puliFactoryClass = PULI_FACTORY_CLASS; + + if (!class_exists($puliFactoryClass)) { + throw new \RuntimeException('Puli Factory class does not exist'); + } + + self::$puliFactory = new $puliFactoryClass(); + } + + return self::$puliFactory; + } + + /** + * Sets the Puli factory. + * + * @param object $puliFactory + */ + public static function setPuliFactory($puliFactory) + { + if (!is_callable([$puliFactory, 'createRepository']) || !is_callable([$puliFactory, 'createDiscovery'])) { + throw new \InvalidArgumentException('The Puli Factory must expose a repository and a discovery'); + } + + self::$puliFactory = $puliFactory; + self::$puliDiscovery = null; + } + + /** + * Resets the factory. + */ + public static function resetPuliFactory() + { + self::$puliFactory = null; + self::$puliDiscovery = null; + } + + /** + * Returns the Puli discovery layer. * - * @param string $class Class that will be instantiated if found - * @param string $condition Optional other class to check for existence + * @return Discovery */ - public static function register($class, $condition = null) + public static function getPuliDiscovery() { - static::$cache = null; + if (!isset(self::$puliDiscovery)) { + $factory = self::getPuliFactory(); + $repository = $factory->createRepository(); - $definition = [ - 'class' => $class, - 'condition' => isset($condition) ? $condition : $class, - ]; + self::$puliDiscovery = $factory->createDiscovery($repository); + } - array_unshift(static::$classes, $definition); + return self::$puliDiscovery; } /** - * Finds a Class. + * Finds a class. * - * @return object + * @param $type + * + * @return string * * @throws NotFoundException */ - public static function find() + public static function findOneByType($type) { - // We have a cache - if (isset(static::$cache)) { - return new static::$cache(); - } + $bindings = self::getPuliDiscovery()->findBindings($type); - foreach (static::$classes as $name => $definition) { - if (static::evaluateCondition($definition['condition'])) { - static::$cache = $definition['class']; + foreach ($bindings as $binding) { + if ($binding->hasParameterValue('depends')) { + $dependency = $binding->getParameterValue('depends'); - return new $definition['class'](); + if (!self::evaluateCondition($dependency)) { + continue; + } } + + // TODO: check class binding + return $binding->getClassName(); } - throw new NotFoundException('Not found'); + throw new NotFoundException(sprintf('Binding of type "%s" not found', $type)); + } + + /** + * Finds a resource. + * + * @return object + */ + public static function find() + { + throw new \LogicException('Not implemented'); } /** diff --git a/src/FactoryDiscovery.php b/src/FactoryDiscovery.php deleted file mode 100644 index f4c9212..0000000 --- a/src/FactoryDiscovery.php +++ /dev/null @@ -1,27 +0,0 @@ - - */ -abstract class FactoryDiscovery extends ClassDiscovery -{ - /** - * {@inheritdoc} - */ - public static function find() - { - try { - return parent::find(); - } catch (NotFoundException $e) { - throw new NotFoundException( - 'No factories found. Install php-http/message to use Guzzle or Diactoros factories.', - 0, - $e - ); - } - } -} diff --git a/src/HttpAsyncClientDiscovery.php b/src/HttpAsyncClientDiscovery.php index 6effc96..f04bfde 100644 --- a/src/HttpAsyncClientDiscovery.php +++ b/src/HttpAsyncClientDiscovery.php @@ -11,31 +11,15 @@ */ final class HttpAsyncClientDiscovery extends ClassDiscovery { - /** - * @var HttpAsyncClient - */ - protected static $cache; - - /** - * @var array - */ - protected static $classes = [ - 'guzzle6' => [ - 'class' => 'Http\Adapter\Guzzle6HttpAdapter', - 'condition' => 'Http\Adapter\Guzzle6HttpAdapter', - ], - ]; - /** * Finds an HTTP Async Client. * * @return HttpAsyncClient - * - * @throws NotFoundException */ public static function find() { - // Override only used for return type declaration - return parent::find(); + $asyncClient = static::findOneByType('Http\Client\HttpAsyncClient'); + + return new $asyncClient(); } } diff --git a/src/HttpClientDiscovery.php b/src/HttpClientDiscovery.php index e6a709c..d329da5 100644 --- a/src/HttpClientDiscovery.php +++ b/src/HttpClientDiscovery.php @@ -11,35 +11,15 @@ */ final class HttpClientDiscovery extends ClassDiscovery { - /** - * @var HttpClient - */ - protected static $cache; - - /** - * @var array - */ - protected static $classes = [ - 'guzzle6' => [ - 'class' => 'Http\Adapter\Guzzle6HttpAdapter', - 'condition' => 'Http\Adapter\Guzzle6HttpAdapter', - ], - 'guzzle5' => [ - 'class' => 'Http\Adapter\Guzzle5HttpAdapter', - 'condition' => 'Http\Adapter\Guzzle5HttpAdapter', - ], - ]; - /** * Finds an HTTP Client. * * @return HttpClient - * - * @throws NotFoundException */ public static function find() { - // Override only used for return type declaration - return parent::find(); + $client = static::findOneByType('Http\Client\HttpClient'); + + return new $client(); } } diff --git a/src/MessageFactoryDiscovery.php b/src/MessageFactoryDiscovery.php index 53c4a8d..1b5b34f 100644 --- a/src/MessageFactoryDiscovery.php +++ b/src/MessageFactoryDiscovery.php @@ -9,43 +9,25 @@ * * @author Márk Sági-Kazár */ -final class MessageFactoryDiscovery extends FactoryDiscovery +final class MessageFactoryDiscovery extends ClassDiscovery { - /** - * @var MessageFactory - */ - protected static $cache; - - /** - * @var array - */ - protected static $classes = [ - 'guzzle' => [ - 'class' => 'Http\Message\MessageFactory\GuzzleMessageFactory', - 'condition' => [ - 'Http\Message\MessageFactory\GuzzleMessageFactory', - 'GuzzleHttp\Psr7\Request', - ], - ], - 'diactoros' => [ - 'class' => 'Http\Message\MessageFactory\DiactorosMessageFactory', - 'condition' => [ - 'Http\Message\MessageFactory\DiactorosMessageFactory', - 'Zend\Diactoros\Request', - ], - ], - ]; - /** * Finds a Message Factory. * * @return MessageFactory - * - * @throws NotFoundException */ public static function find() { - // Override only used for return type declaration - return parent::find(); + try { + $messageFactory = static::findOneByType('Http\Message\MessageFactory'); + + return new $messageFactory(); + } catch (NotFoundException $e) { + throw new NotFoundException( + 'No factories found. Install php-http/message to use Guzzle or Diactoros factories.', + 0, + $e + ); + } } } diff --git a/src/StreamFactoryDiscovery.php b/src/StreamFactoryDiscovery.php index 047ff8f..642437a 100644 --- a/src/StreamFactoryDiscovery.php +++ b/src/StreamFactoryDiscovery.php @@ -9,43 +9,25 @@ * * @author Михаил Красильников */ -final class StreamFactoryDiscovery extends FactoryDiscovery +final class StreamFactoryDiscovery extends ClassDiscovery { - /** - * @var StreamFactory - */ - protected static $cache; - - /** - * @var array - */ - protected static $classes = [ - 'guzzle' => [ - 'class' => 'Http\Message\StreamFactory\GuzzleStreamFactory', - 'condition' => [ - 'Http\Message\StreamFactory\GuzzleStreamFactory', - 'GuzzleHttp\Psr7\Stream', - ], - ], - 'diactoros' => [ - 'class' => 'Http\Message\StreamFactory\DiactorosStreamFactory', - 'condition' => [ - 'Http\Message\StreamFactory\DiactorosStreamFactory', - 'Zend\Diactoros\Stream', - ], - ], - ]; - /** * Finds a Stream Factory. * * @return StreamFactory - * - * @throws NotFoundException */ public static function find() { - // Override only used for return type declaration - return parent::find(); + try { + $streamFactory = static::findOneByType('Http\Message\StreamFactory'); + + return new $streamFactory(); + } catch (NotFoundException $e) { + throw new NotFoundException( + 'No factories found. Install php-http/message to use Guzzle or Diactoros factories.', + 0, + $e + ); + } } } diff --git a/src/UriFactoryDiscovery.php b/src/UriFactoryDiscovery.php index 8ce9648..7224a58 100644 --- a/src/UriFactoryDiscovery.php +++ b/src/UriFactoryDiscovery.php @@ -9,33 +9,8 @@ * * @author David de Boer */ -final class UriFactoryDiscovery extends FactoryDiscovery +final class UriFactoryDiscovery extends ClassDiscovery { - /** - * @var UriFactory - */ - protected static $cache; - - /** - * @var array - */ - protected static $classes = [ - 'guzzle' => [ - 'class' => 'Http\Message\UriFactory\GuzzleUriFactory', - 'condition' => [ - 'Http\Message\UriFactory\GuzzleUriFactory', - 'GuzzleHttp\Psr7\Uri', - ], - ], - 'diactoros' => [ - 'class' => 'Http\Message\UriFactory\DiactorosUriFactory', - 'condition' => [ - 'Http\Message\UriFactory\DiactorosUriFactory', - 'Zend\Diactoros\Uri', - ], - ], - ]; - /** * Finds a URI Factory. * @@ -43,7 +18,16 @@ final class UriFactoryDiscovery extends FactoryDiscovery */ public static function find() { - // Override only used for return type declaration - return parent::find(); + try { + $uriFactory = static::findOneByType('Http\Message\UriFactory'); + + return new $uriFactory(); + } catch (NotFoundException $e) { + throw new NotFoundException( + 'No factories found. Install php-http/message to use Guzzle or Diactoros factories.', + 0, + $e + ); + } } }