Skip to content

Commit

Permalink
Merge pull request #27 from kordos/silex-2
Browse files Browse the repository at this point in the history
Silex 2
  • Loading branch information
mnapoli committed Dec 7, 2017
2 parents 78e24e6 + 71026ec commit 69c3883
Show file tree
Hide file tree
Showing 5 changed files with 150 additions and 6 deletions.
10 changes: 5 additions & 5 deletions .travis.yml
@@ -1,27 +1,27 @@
language: php

sudo: false

php:
- 5.5
- 5.6
- 7.0
- hhvm
- 7.1

matrix:
include:
- php: 5.5
env: dependencies=lowest

sudo: false

before_script:
- composer self-update
- if [[ "$TRAVIS_PHP_VERSION" == '5.6' ]]; then composer require satooshi/php-coveralls:dev-master -n ; fi
- if [[ "$TRAVIS_PHP_VERSION" != '5.6' ]]; then composer install -n ; fi
- if [ "$dependencies" = "lowest" ]; then composer update --prefer-lowest --prefer-stable -n; fi;

script:
- if [[ "$TRAVIS_PHP_VERSION" == '5.6' ]]; then phpunit --coverage-clover clover.xml ; fi
- if [[ "$TRAVIS_PHP_VERSION" != '5.6' ]]; then phpunit ; fi
- if [[ "$TRAVIS_PHP_VERSION" == '5.6' ]]; then ./vendor/bin/phpunit --coverage-clover clover.xml ; fi
- if [[ "$TRAVIS_PHP_VERSION" != '5.6' ]]; then ./vendor/bin/phpunit ; fi

after_script:
- if [[ "$TRAVIS_PHP_VERSION" == '5.6' ]]; then php vendor/bin/coveralls -v ; fi
2 changes: 1 addition & 1 deletion composer.json
Expand Up @@ -21,7 +21,7 @@
"pimple/pimple" : "~3.0"
},
"require-dev": {
"phpunit/phpunit": "~4.5",
"phpunit/phpunit": "^4.8.36 | ^5.7.21",
"twig/twig": "~1.8",
"swiftmailer/swiftmailer": "^5.4"
}
Expand Down
64 changes: 64 additions & 0 deletions src/Controller/ArgumentResolver.php
@@ -0,0 +1,64 @@
<?php

namespace DI\Bridge\Silex\Controller;

use Invoker\ParameterResolver\ParameterResolver;
use Invoker\Reflection\CallableReflection;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Controller\ArgumentResolverInterface;

/**
* {@inheritdoc}
*/
class ArgumentResolver implements ArgumentResolverInterface
{
/**
* @var ParameterResolver
*/
private $parameterResolver;

public function __construct(ParameterResolver $parameterResolver)
{
$this->parameterResolver = $parameterResolver;
}

/**
* {@inheritdoc}
*/
public function getArguments(Request $request, $controller)
{
$controllerReflection = CallableReflection::create($controller);
$controllerParameters = $controllerReflection->getParameters();
$resolvedArguments = [];

foreach ($controllerParameters as $index => $parameter) {
if ('request' === $parameter->getName() || ($parameter->getClass() && $parameter->getClass()->isInstance($request))) {
$resolvedArguments[$index] = $request;

break;
}
}

$arguments = $this->parameterResolver->getParameters(
$controllerReflection,
$request->attributes->all(),
$resolvedArguments
);

ksort($arguments);

// Check if all parameters are resolved
$diff = array_diff_key($controllerParameters, $arguments);
if (0 < count($diff)) {
/** @var \ReflectionParameter $parameter */
$parameter = reset($diff);
throw new \RuntimeException(sprintf(
'Controller "%s" requires that you provide a value for the "$%s" argument.',
$controllerReflection->getName(),
$parameter->getName()
));
}

return $arguments;
}
}
14 changes: 14 additions & 0 deletions src/Provider/HttpKernelServiceProvider.php
Expand Up @@ -4,6 +4,7 @@

use DI\Bridge\Silex\CallbackInvoker;
use DI\Bridge\Silex\CallbackResolver;
use DI\Bridge\Silex\Controller\ArgumentResolver;
use DI\Bridge\Silex\Controller\ControllerResolver;
use DI\Bridge\Silex\ConverterListener;
use DI\Bridge\Silex\MiddlewareListener;
Expand All @@ -15,6 +16,7 @@
use Silex\Api\EventListenerProviderInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Kernel;

/**
* @author Jacob Dreesen <jacob.dreesen@gmail.com>
Expand Down Expand Up @@ -61,6 +63,18 @@ public function register(\Pimple\Container $app)
$app['phpdi.callable_resolver']
);
};

// Override the argument resolver with ours.
if (Kernel::VERSION_ID >= 30100) {
$app['argument_resolver'] = function () {
return new ArgumentResolver(
new ResolverChain([
new AssociativeArrayResolver,
new TypeHintContainerResolver($this->container),
])
);
};
}
}

public function subscribe(\Pimple\Container $app, EventDispatcherInterface $dispatcher)
Expand Down
66 changes: 66 additions & 0 deletions tests/Provider/HttpKernelServiceProviderTest.php
@@ -0,0 +1,66 @@
<?php

namespace DI\Bridge\Silex\Test\Provider;

use DI\Bridge\Silex\Application;
use DI\Bridge\Silex\CallbackInvoker;
use DI\Bridge\Silex\CallbackResolver;
use DI\Bridge\Silex\Controller\ArgumentResolver;
use DI\Bridge\Silex\Controller\ControllerResolver;
use DI\Bridge\Silex\Provider\HttpKernelServiceProvider;
use Interop\Container\ContainerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Controller\ArgumentResolverInterface;
use Symfony\Component\HttpKernel\Kernel;

class HttpKernelServiceProviderTest extends \PHPUnit_Framework_TestCase
{
/**
* @var ContainerInterface
*/
private $container;

/**
* @var CallbackInvoker
*/
private $callbackInvoker;

/**
* @var Application
*/
private $application;

/**
* @var HttpKernelServiceProvider
*/
private $httpKernelProvider;

public function setUp()
{
$this->container = $this->prophesize(ContainerInterface::class);
$this->callbackInvoker = $this->prophesize(CallbackInvoker::class);
$this->httpKernelProvider = new HttpKernelServiceProvider($this->container->reveal(), $this->callbackInvoker->reveal());
$this->application = new Application();
}

public function test_register_application_with_default_services()
{
$this->httpKernelProvider->register($this->application);

$this->assertArrayHasKey('resolver', $this->application);
$this->assertInstanceOf(ControllerResolver::class, $this->application['resolver']);
$this->assertArrayHasKey('callback_resolver', $this->application);
$this->assertInstanceOf(CallbackResolver::class, $this->application['callback_resolver']);
}

public function test_register_application_have_bridge_argument_resolver_service()
{
$this->httpKernelProvider->register($this->application);

if (Kernel::VERSION_ID >= 30100) {
$this->assertArrayHasKey('argument_resolver', $this->application);
$this->assertInstanceOf(ArgumentResolverInterface::class, $this->application['argument_resolver']);
$this->assertInstanceOf(ArgumentResolver::class, $this->application['argument_resolver']);
}
}
}

0 comments on commit 69c3883

Please sign in to comment.