diff --git a/src/MessageFactoryDiscovery.php b/src/MessageFactoryDiscovery.php index c21b9bf..4ccc90f 100644 --- a/src/MessageFactoryDiscovery.php +++ b/src/MessageFactoryDiscovery.php @@ -9,6 +9,8 @@ * Finds a Message Factory. * * @author Márk Sági-Kazár + * + * @deprecated This will be removed in 2.0. Consider using Psr17FactoryDiscovery. */ final class MessageFactoryDiscovery extends ClassDiscovery { diff --git a/src/Psr17FactoryDiscovery.php b/src/Psr17FactoryDiscovery.php new file mode 100644 index 0000000..f655d57 --- /dev/null +++ b/src/Psr17FactoryDiscovery.php @@ -0,0 +1,124 @@ + + */ +final class Psr17FactoryDiscovery extends ClassDiscovery +{ + private static function createException($type, Exception $e) + { + new \Http\Discovery\Exception\NotFoundException( + 'No psr-17 '.$type.' found. Install a package from this list: https://packagist.org/providers/psr/http-factory-implementation', + 0, + $e + ); + } + + /** + * @return RequestFactoryInterface + * + * @throws Exception\NotFoundException + */ + public static function findRequestFactory() + { + try { + $messageFactory = static::findOneByType(RequestFactoryInterface::class); + } catch (DiscoveryFailedException $e) { + throw self::createException('request factory', $e); + } + + return static::instantiateClass($messageFactory); + } + + /** + * @return RequestFactoryInterface + * + * @throws Exception\NotFoundException + */ + public static function findResponseFactory() + { + try { + $messageFactory = static::findOneByType(ResponseFactoryInterface::class); + } catch (DiscoveryFailedException $e) { + throw self::createException('response factory', $e); + } + + return static::instantiateClass($messageFactory); + } + + /** + * @return ServerRequestFactoryInterface + * + * @throws Exception\NotFoundException + */ + public static function findServerRequestFactory() + { + try { + $messageFactory = static::findOneByType(ServerRequestFactoryInterface::class); + } catch (DiscoveryFailedException $e) { + throw self::createException('server request factory', $e); + } + + return static::instantiateClass($messageFactory); + } + + /** + * @return StreamFactoryInterface + * + * @throws Exception\NotFoundException + */ + public static function findStreamFactory() + { + try { + $messageFactory = static::findOneByType(StreamFactoryInterface::class); + } catch (DiscoveryFailedException $e) { + throw self::createException('stream factory', $e); + } + + return static::instantiateClass($messageFactory); + } + + /** + * @return UploadedFileFactoryInterface + * + * @throws Exception\NotFoundException + */ + public static function findUploadedFileFactory() + { + try { + $messageFactory = static::findOneByType(UploadedFileFactoryInterface::class); + } catch (DiscoveryFailedException $e) { + throw self::createException('uploaded file factory', $e); + } + + return static::instantiateClass($messageFactory); + } + + /** + * @return UriFactoryInterface + * + * @throws Exception\NotFoundException + */ + public static function findUrlFactory() + { + try { + $messageFactory = static::findOneByType(UriFactoryInterface::class); + } catch (DiscoveryFailedException $e) { + throw self::createException('url factory', $e); + } + + return static::instantiateClass($messageFactory); + } +} diff --git a/src/Strategy/CommonPsr17ClassesStrategy.php b/src/Strategy/CommonPsr17ClassesStrategy.php new file mode 100644 index 0000000..05062eb --- /dev/null +++ b/src/Strategy/CommonPsr17ClassesStrategy.php @@ -0,0 +1,81 @@ + + */ +final class CommonPsr17ClassesStrategy implements DiscoveryStrategy +{ + /** + * @var array + */ + private static $classes = [ + RequestFactoryInterface::class => [ + 'Nyholm\Psr7\Factory\Psr17Factory', + 'Zend\Diactoros\RequestFactory', + 'Http\Factory\Diactoros\RequestFactory', + 'Http\Factory\Guzzle\RequestFactory', + 'Http\Factory\Slim\RequestFactory', + ], + ResponseFactoryInterface::class => [ + 'Nyholm\Psr7\Factory\Psr17Factory', + 'Zend\Diactoros\ResponseFactory', + 'Http\Factory\Diactoros\ResponseFactory', + 'Http\Factory\Guzzle\ResponseFactory', + 'Http\Factory\Slim\ResponseFactory', + ], + ServerRequestFactoryInterface::class => [ + 'Nyholm\Psr7\Factory\Psr17Factory', + 'Zend\Diactoros\ServerRequestFactory', + 'Http\Factory\Diactoros\ServerRequestFactory', + 'Http\Factory\Guzzle\ServerRequestFactory', + 'Http\Factory\Slim\ServerRequestFactory', + ], + StreamFactoryInterface::class => [ + 'Nyholm\Psr7\Factory\Psr17Factory', + 'Zend\Diactoros\StreamFactory', + 'Http\Factory\Diactoros\StreamFactory', + 'Http\Factory\Guzzle\StreamFactory', + 'Http\Factory\Slim\StreamFactory', + ], + UploadedFileFactoryInterface::class => [ + 'Nyholm\Psr7\Factory\Psr17Factory', + 'Zend\Diactoros\UploadedFileFactory', + 'Http\Factory\Diactoros\UploadedFileFactory', + 'Http\Factory\Guzzle\UploadedFileFactory', + 'Http\Factory\Slim\UploadedFileFactory', + ], + UriFactoryInterface::class => [ + 'Nyholm\Psr7\Factory\Psr17Factory', + 'Zend\Diactoros\UriFactory', + 'Http\Factory\Diactoros\UriFactory', + 'Http\Factory\Guzzle\UriFactory', + 'Http\Factory\Slim\UriFactory', + ], + ]; + + /** + * {@inheritdoc} + */ + public static function getCandidates($type) + { + $candidates = []; + if (isset(self::$classes[$type])) { + foreach (self::$classes[$type] as $class) { + $candidates[] = ['class' => $class, 'condition' => [$class]]; + } + } + + return $candidates; + } +} diff --git a/src/StreamFactoryDiscovery.php b/src/StreamFactoryDiscovery.php index 7bcc8ce..75b15ac 100644 --- a/src/StreamFactoryDiscovery.php +++ b/src/StreamFactoryDiscovery.php @@ -9,6 +9,8 @@ * Finds a Stream Factory. * * @author Михаил Красильников + * + * @deprecated This will be removed in 2.0. Consider using Psr17FactoryDiscovery. */ final class StreamFactoryDiscovery extends ClassDiscovery { diff --git a/src/UriFactoryDiscovery.php b/src/UriFactoryDiscovery.php index 1eef1e6..c31f783 100644 --- a/src/UriFactoryDiscovery.php +++ b/src/UriFactoryDiscovery.php @@ -9,6 +9,8 @@ * Finds a URI Factory. * * @author David de Boer + * + * @deprecated This will be removed in 2.0. Consider using Psr17FactoryDiscovery. */ final class UriFactoryDiscovery extends ClassDiscovery {