77use DI \Bridge \Slim \Bridge ;
88use DI \Bridge \Slim \ControllerInvoker ;
99use Invoker \Invoker ;
10+ use Invoker \InvokerInterface ;
1011use Invoker \ParameterResolver \AssociativeArrayResolver ;
1112use Invoker \ParameterResolver \Container \TypeHintContainerResolver ;
1213use Invoker \ParameterResolver \DefaultValueResolver ;
1314use Invoker \ParameterResolver \ResolverChain ;
1415use Invoker \ParameterResolver \TypeHintResolver ;
1516use Psr \Container \ContainerInterface ;
1617use Psr \Http \Message \ResponseFactoryInterface ;
18+ use Psr \Http \Message \StreamFactoryInterface ;
1719use RuntimeException ;
1820use Slim \App ;
1921use Slim \Interfaces \CallableResolverInterface ;
2022use Slim \Middleware \ErrorMiddleware ;
2123use Slim \Psr7 \Factory \ResponseFactory ;
24+ use Slim \Psr7 \Factory \StreamFactory ;
2225use Symfony \Component \PropertyInfo \Extractor \PhpDocExtractor ;
2326use Symfony \Component \PropertyInfo \Extractor \ReflectionExtractor ;
2427use Symfony \Component \PropertyInfo \PropertyInfoExtractor ;
3033use Symfony \Component \Serializer \Serializer ;
3134use Symfony \Component \Serializer \SerializerInterface ;
3235use WonderNetwork \SlimKernel \Http \Serializer \DeserializeParameterResolver ;
36+ use WonderNetwork \SlimKernel \Http \Serializer \JsonSerializingInvoker ;
37+ use WonderNetwork \SlimKernel \Http \Serializer \JsonSerializingInvokerOptions ;
3338use WonderNetwork \SlimKernel \ServiceFactory ;
3439use WonderNetwork \SlimKernel \ServicesBuilder ;
3540use WonderNetwork \SlimKernel \SlimExtension \ErrorMiddlewareConfiguration ;
41+ use function DI \autowire ;
3642use function DI \get ;
3743
3844final class SlimServiceFactory implements ServiceFactory {
3945 public const string INPUT_DENORMALIZER = self ::class.':input-denormalizer ' ;
46+ public const string INVOKER = self ::class.':invoker ' ;
4047
4148 public function __invoke (ServicesBuilder $ builder ): iterable {
4249 yield Serializer::class => static fn () => new Serializer ([
@@ -56,7 +63,7 @@ public function __invoke(ServicesBuilder $builder): iterable {
5663 yield SerializerInterface::class => get (Serializer::class);
5764 yield self ::INPUT_DENORMALIZER => get (DenormalizerInterface::class);
5865
59- yield ControllerInvoker ::class => static function (ContainerInterface $ container ) {
66+ yield Invoker ::class => static function (ContainerInterface $ container ) {
6067 $ serializer = $ container ->get (SlimServiceFactory::INPUT_DENORMALIZER );
6168
6269 if (false === $ serializer instanceof DenormalizerInterface) {
@@ -70,21 +77,45 @@ public function __invoke(ServicesBuilder $builder): iterable {
7077 );
7178 }
7279
73- return new ControllerInvoker (
74- new Invoker (
75- new ResolverChain ([
76- new TypeHintResolver (),
77- new AssociativeArrayResolver (),
78- new DeserializeParameterResolver ($ serializer ),
79- new TypeHintContainerResolver ($ container ),
80- new DefaultValueResolver (),
81- ]),
82- $ container ,
83- ),
80+ return new Invoker (
81+ new ResolverChain ([
82+ new TypeHintResolver (),
83+ new AssociativeArrayResolver (),
84+ new DeserializeParameterResolver ($ serializer ),
85+ new TypeHintContainerResolver ($ container ),
86+ new DefaultValueResolver (),
87+ ]),
88+ $ container ,
8489 );
8590 };
8691
92+ yield JsonSerializingInvoker::class => autowire ()->constructor (
93+ get (Invoker::class),
94+ );
95+
96+ yield self ::INVOKER => get (JsonSerializingInvoker::class);
97+
98+ yield ControllerInvoker::class => static function (ContainerInterface $ container ) {
99+ $ invoker = $ container ->get (SlimServiceFactory::INVOKER );
100+
101+ if (false === $ invoker instanceof InvokerInterface) {
102+ throw new RuntimeException (
103+ sprintf (
104+ 'Service registered under %s key is expected to implement %s interface, %s given ' ,
105+ SlimServiceFactory::INVOKER ,
106+ InvokerInterface::class,
107+ get_debug_type ($ invoker ),
108+ ),
109+ );
110+ }
111+
112+ return new ControllerInvoker ($ invoker );
113+ };
114+
115+ yield JsonSerializingInvokerOptions::class => static fn () => JsonSerializingInvokerOptions::onlyExplicitlyMarked ();
116+
87117 yield ResponseFactoryInterface::class => static fn () => new ResponseFactory ();
118+ yield StreamFactoryInterface::class => static fn () => new StreamFactory ();
88119 yield ErrorMiddlewareConfiguration::class => static fn () => ErrorMiddlewareConfiguration::silent ();
89120
90121 yield ErrorMiddleware::class => static fn (
0 commit comments