|
2 | 2 |
|
3 | 3 | namespace DI\Bridge\Slim;
|
4 | 4 |
|
5 |
| -use DI\ContainerBuilder; |
| 5 | +use Invoker\Invoker; |
| 6 | +use Invoker\ParameterResolver\AssociativeArrayResolver; |
| 7 | +use Invoker\ParameterResolver\Container\TypeHintContainerResolver; |
| 8 | +use Invoker\ParameterResolver\DefaultValueResolver; |
| 9 | +use Invoker\ParameterResolver\ResolverChain; |
| 10 | +use Psr\Container\ContainerInterface; |
| 11 | +use Slim\Factory\AppFactory; |
| 12 | +use \Invoker\CallableResolver as InvokerCallableResolver; |
6 | 13 |
|
7 | 14 | /**
|
8 | 15 | * Slim application configured with PHP-DI.
|
9 | 16 | *
|
10 | 17 | * As you can see, this class is very basic and is only useful to get started quickly.
|
11 | 18 | * You can also very well *not* use it and build the container manually.
|
12 | 19 | */
|
13 |
| -class App extends \Slim\App |
| 20 | +class App |
14 | 21 | {
|
15 |
| - public function __construct() |
| 22 | + public static function boot(ContainerInterface $container) |
16 | 23 | {
|
17 |
| - $containerBuilder = new ContainerBuilder; |
18 |
| - $containerBuilder->addDefinitions(__DIR__ . '/config.php'); |
19 |
| - $this->configureContainer($containerBuilder); |
20 |
| - $container = $containerBuilder->build(); |
| 24 | + AppFactory::setContainer($container); |
| 25 | + $callableResolver = new InvokerCallableResolver($container); |
| 26 | + AppFactory::setCallableResolver(new CallableResolver($callableResolver)); |
21 | 27 |
|
22 |
| - parent::__construct($container); |
23 |
| - } |
| 28 | + $app = AppFactory::create(); |
24 | 29 |
|
25 |
| - /** |
26 |
| - * Override this method to configure the container builder. |
27 |
| - * |
28 |
| - * For example, to load additional configuration files: |
29 |
| - * |
30 |
| - * protected function configureContainer(ContainerBuilder $builder) |
31 |
| - * { |
32 |
| - * $builder->addDefinitions(__DIR__ . 'my-config-file.php'); |
33 |
| - * } |
34 |
| - */ |
35 |
| - protected function configureContainer(ContainerBuilder $builder) |
36 |
| - { |
| 30 | + $resolvers = [ |
| 31 | + // Inject parameters by name first |
| 32 | + new AssociativeArrayResolver(), |
| 33 | + // Then inject services by type-hints for those that weren't resolved |
| 34 | + new TypeHintContainerResolver($container), |
| 35 | + // Then fall back on parameters default values for optional route parameters |
| 36 | + new DefaultValueResolver(), |
| 37 | + ]; |
| 38 | + |
| 39 | + $invoker = new Invoker(new ResolverChain($resolvers), $container); |
| 40 | + $app->getRouteCollector()->setDefaultInvocationStrategy(new ControllerInvoker($invoker)); |
| 41 | + |
| 42 | + return $app; |
37 | 43 | }
|
38 | 44 | }
|
0 commit comments