Skip to content

Commit

Permalink
Merge a420955 into 8e939b9
Browse files Browse the repository at this point in the history
  • Loading branch information
l0gicgate committed May 8, 2019
2 parents 8e939b9 + a420955 commit 7ba52ee
Show file tree
Hide file tree
Showing 21 changed files with 533 additions and 49 deletions.
1 change: 1 addition & 0 deletions .travis.yml
Expand Up @@ -9,6 +9,7 @@ matrix:
- php: 7.2
- php: 7.3
- php: nightly

allow_failures:
- php: nightly

Expand Down
53 changes: 40 additions & 13 deletions Slim/Factory/AppFactory.php
Expand Up @@ -13,26 +13,20 @@
use Psr\Http\Message\ResponseFactoryInterface;
use RuntimeException;
use Slim\App;
use Slim\Factory\Psr17\GuzzlePsr17Factory;
use Slim\Factory\Psr17\NyholmPsr17Factory;
use Slim\Factory\Psr17\Psr17Factory;
use Slim\Factory\Psr17\SlimPsr17Factory;
use Slim\Factory\Psr17\ZendDiactorosPsr17Factory;
use Slim\Factory\Psr17\Psr17FactoryProvider;
use Slim\Factory\Psr17\SlimHttpPsr17Factory;
use Slim\Interfaces\CallableResolverInterface;
use Slim\Interfaces\Psr17FactoryProviderInterface;
use Slim\Interfaces\RouteCollectorInterface;
use Slim\Interfaces\RouteResolverInterface;

class AppFactory
{
/**
* @var array
* @var Psr17FactoryProviderInterface|null
*/
protected static $psr17Factories = [
SlimPsr17Factory::class,
NyholmPsr17Factory::class,
ZendDiactorosPsr17Factory::class,
GuzzlePsr17Factory::class,
];
protected static $psr17FactoryProvider;

/**
* @var ResponseFactoryInterface|null
Expand All @@ -59,6 +53,11 @@ class AppFactory
*/
protected static $routeResolver;

/**
* @var bool
*/
protected static $slimHttpDecoratorsAutomaticDetectionEnabled = true;

/**
* @param ResponseFactoryInterface|null $responseFactory
* @param ContainerInterface|null $container
Expand Down Expand Up @@ -89,10 +88,22 @@ public static function create(
*/
public static function determineResponseFactory(): ResponseFactoryInterface
{
$psr17FactoryProvider = static::$psr17FactoryProvider ?? new Psr17FactoryProvider();

/** @var Psr17Factory $psr17factory */
foreach (self::$psr17Factories as $psr17factory) {
foreach ($psr17FactoryProvider->getFactories() as $psr17factory) {
if ($psr17factory::isResponseFactoryAvailable()) {
return $psr17factory::getResponseFactory();
$responseFactory = $psr17factory::getResponseFactory();

if (static::$slimHttpDecoratorsAutomaticDetectionEnabled
&& SlimHttpPsr17Factory::isResponseFactoryAvailable()
&& $psr17factory::isStreamFactoryAvailable()
) {
$streamFactory = $psr17factory::getStreamFactory();
return SlimHttpPsr17Factory::createDecoratedResponseFactory($responseFactory, $streamFactory);
}

return $responseFactory;
}
}

Expand All @@ -103,6 +114,14 @@ public static function determineResponseFactory(): ResponseFactoryInterface
);
}

/**
* @param Psr17FactoryProviderInterface $psr17FactoryProvider
*/
public static function setPsr17FactoryProvider(Psr17FactoryProviderInterface $psr17FactoryProvider): void
{
static::$psr17FactoryProvider = $psr17FactoryProvider;
}

/**
* @param ResponseFactoryInterface $responseFactory
*/
Expand Down Expand Up @@ -142,4 +161,12 @@ public static function setRouteResolver(RouteResolverInterface $routeResolver):
{
static::$routeResolver = $routeResolver;
}

/**
* @param bool $enabled
*/
public static function setSlimHttpDecoratorsAutomaticDetection(bool $enabled): void
{
static::$slimHttpDecoratorsAutomaticDetectionEnabled = $enabled;
}
}
1 change: 1 addition & 0 deletions Slim/Factory/Psr17/GuzzlePsr17Factory.php
Expand Up @@ -12,6 +12,7 @@
class GuzzlePsr17Factory extends Psr17Factory
{
protected static $responseFactoryClass = 'Http\Factory\Guzzle\ResponseFactory';
protected static $streamFactoryClass = 'Http\Factory\Guzzle\StreamFactory';
protected static $serverRequestCreatorClass = 'GuzzleHttp\Psr7\ServerRequest';
protected static $serverRequestCreatorMethod = 'fromGlobals';
}
1 change: 1 addition & 0 deletions Slim/Factory/Psr17/NyholmPsr17Factory.php
Expand Up @@ -8,6 +8,7 @@
class NyholmPsr17Factory extends Psr17Factory
{
protected static $responseFactoryClass = 'Nyholm\Psr7\Factory\Psr17Factory';
protected static $streamFactoryClass = 'Nyholm\Psr7\Factory\Psr17Factory';
protected static $serverRequestCreatorClass = 'Nyholm\Psr7Server\ServerRequestCreator';
protected static $serverRequestCreatorMethod = 'fromGlobals';

Expand Down
43 changes: 41 additions & 2 deletions Slim/Factory/Psr17/Psr17Factory.php
Expand Up @@ -10,6 +10,8 @@
namespace Slim\Factory\Psr17;

use Psr\Http\Message\ResponseFactoryInterface;
use Psr\Http\Message\StreamFactoryInterface;
use RuntimeException;
use Slim\Interfaces\Psr17FactoryInterface;
use Slim\Interfaces\ServerRequestCreatorInterface;

Expand All @@ -20,6 +22,11 @@ abstract class Psr17Factory implements Psr17FactoryInterface
*/
protected static $responseFactoryClass;

/**
* @var string
*/
protected static $streamFactoryClass;

/**
* @var string
*/
Expand All @@ -35,14 +42,34 @@ abstract class Psr17Factory implements Psr17FactoryInterface
*/
public static function getResponseFactory(): ResponseFactoryInterface
{
if (!static::isResponseFactoryAvailable()) {
throw new RuntimeException(get_called_class() . ' could not instantiate a response factory.');
}

return new static::$responseFactoryClass;
}

/**
* {@inheritdoc}
*/
public static function getStreamFactory(): StreamFactoryInterface
{
if (!static::isStreamFactoryAvailable()) {
throw new RuntimeException(get_called_class() . ' could not instantiate a stream factory.');
}

return new static::$streamFactoryClass;
}

/**
* {@inheritdoc}
*/
public static function getServerRequestCreator(): ServerRequestCreatorInterface
{
if (!static::isServerRequestCreatorAvailable()) {
throw new RuntimeException(get_called_class() . ' could not instantiate a server request creator.');
}

return new ServerRequestCreator(static::$serverRequestCreatorClass, static::$serverRequestCreatorMethod);
}

Expand All @@ -51,14 +78,26 @@ public static function getServerRequestCreator(): ServerRequestCreatorInterface
*/
public static function isResponseFactoryAvailable(): bool
{
return class_exists(static::$responseFactoryClass);
return static::$responseFactoryClass && class_exists(static::$responseFactoryClass);
}

/**
* {@inheritdoc}
*/
public static function isStreamFactoryAvailable(): bool
{
return static::$streamFactoryClass && class_exists(static::$streamFactoryClass);
}

/**
* {@inheritdoc}
*/
public static function isServerRequestCreatorAvailable(): bool
{
return class_exists(static::$serverRequestCreatorClass);
return (
static::$serverRequestCreatorClass
&& static::$serverRequestCreatorMethod
&& class_exists(static::$serverRequestCreatorClass)
);
}
}
43 changes: 43 additions & 0 deletions Slim/Factory/Psr17/Psr17FactoryProvider.php
@@ -0,0 +1,43 @@
<?php
declare(strict_types=1);

namespace Slim\Factory\Psr17;

use Slim\Interfaces\Psr17FactoryProviderInterface;

class Psr17FactoryProvider implements Psr17FactoryProviderInterface
{
/**
* @var array
*/
protected static $factories = [
SlimPsr17Factory::class,
NyholmPsr17Factory::class,
ZendDiactorosPsr17Factory::class,
GuzzlePsr17Factory::class,
];

/**
* {@inheritdoc}
*/
public static function getFactories(): array
{
return static::$factories;
}

/**
* {@inheritdoc}
*/
public static function setFactories(array $factories): void
{
static::$factories = $factories;
}

/**
* {@inheritdoc}
*/
public static function addFactory(string $factory): void
{
array_unshift(static::$factories, $factory);
}
}
30 changes: 30 additions & 0 deletions Slim/Factory/Psr17/SlimHttpPsr17Factory.php
@@ -0,0 +1,30 @@
<?php
/**
* Slim Framework (https://slimframework.com)
*
* @license https://github.com/slimphp/Slim/blob/4.x/LICENSE.md (MIT License)
*/

declare(strict_types=1);

namespace Slim\Factory\Psr17;

use Psr\Http\Message\ResponseFactoryInterface;
use Psr\Http\Message\StreamFactoryInterface;

class SlimHttpPsr17Factory extends Psr17Factory
{
protected static $responseFactoryClass = 'Slim\Http\Factory\DecoratedResponseFactory';

/**
* @param ResponseFactoryInterface $responseFactory
* @param StreamFactoryInterface $streamFactory
* @return ResponseFactoryInterface
*/
public static function createDecoratedResponseFactory(
ResponseFactoryInterface $responseFactory,
StreamFactoryInterface $streamFactory
): ResponseFactoryInterface {
return new static::$responseFactoryClass($responseFactory, $streamFactory);
}
}
57 changes: 57 additions & 0 deletions Slim/Factory/Psr17/SlimHttpServerRequestCreator.php
@@ -0,0 +1,57 @@
<?php
/**
* Slim Framework (https://slimframework.com)
*
* @license https://github.com/slimphp/Slim/blob/4.x/LICENSE.md (MIT License)
*/

declare(strict_types=1);

namespace Slim\Factory\Psr17;

use Psr\Http\Message\ServerRequestInterface;
use RuntimeException;
use Slim\Interfaces\ServerRequestCreatorInterface;

class SlimHttpServerRequestCreator implements ServerRequestCreatorInterface
{
/**
* @var ServerRequestCreatorInterface
*/
protected $serverRequestCreator;

/**
* @var string
*/
protected static $serverRequestDecoratorClass = 'Slim\Http\ServerRequest';

/**
* @param ServerRequestCreatorInterface $serverRequestCreator
*/
public function __construct(ServerRequestCreatorInterface $serverRequestCreator)
{
$this->serverRequestCreator = $serverRequestCreator;
}

/**
* {@inheritdoc}
*/
public function createServerRequestFromGlobals(): ServerRequestInterface
{
if (!static::isServerRequestDecoratorAvailable()) {
throw new RuntimeException('The Slim-Http ServerRequest decorator is not available.');
}

$request = $this->serverRequestCreator->createServerRequestFromGlobals();

return new static::$serverRequestDecoratorClass($request);
}

/**
* @return bool
*/
public static function isServerRequestDecoratorAvailable(): bool
{
return class_exists(static::$serverRequestDecoratorClass);
}
}
1 change: 1 addition & 0 deletions Slim/Factory/Psr17/SlimPsr17Factory.php
Expand Up @@ -12,6 +12,7 @@
class SlimPsr17Factory extends Psr17Factory
{
protected static $responseFactoryClass = 'Slim\Psr7\Factory\ResponseFactory';
protected static $streamFactoryClass = 'Slim\Psr7\Factory\StreamFactory';
protected static $serverRequestCreatorClass = 'Slim\Psr7\Factory\ServerRequestFactory';
protected static $serverRequestCreatorMethod = 'createFromGlobals';
}
1 change: 1 addition & 0 deletions Slim/Factory/Psr17/ZendDiactorosPsr17Factory.php
Expand Up @@ -12,6 +12,7 @@
class ZendDiactorosPsr17Factory extends Psr17Factory
{
protected static $responseFactoryClass = 'Zend\Diactoros\ResponseFactory';
protected static $streamFactoryClass = 'Zend\Diactoros\StreamFactory';
protected static $serverRequestCreatorClass = 'Zend\Diactoros\ServerRequestFactory';
protected static $serverRequestCreatorMethod = 'fromGlobals';
}

0 comments on commit 7ba52ee

Please sign in to comment.