44
55namespace Respect \Rest ;
66
7+ use Psr \Container \ContainerInterface ;
78use Psr \Http \Message \ResponseFactoryInterface ;
89use Psr \Http \Message \ResponseInterface ;
910use Psr \Http \Message \ServerRequestInterface ;
1011use Psr \Http \Message \StreamFactoryInterface ;
11- use ReflectionFunctionAbstract ;
12- use ReflectionParameter ;
12+ use Respect \Parameter \Resolver ;
1313use Respect \Rest \Routes \AbstractRoute ;
14- use Respect \Rest \Routines \ParamSynced ;
15- use Respect \Rest \Routines \Routinable ;
1614use Throwable ;
1715
1816use function is_a ;
2321use function strtoupper ;
2422
2523/** Internal routing context wrapping a PSR-7 server request */
26- final class DispatchContext
24+ final class DispatchContext implements ContainerInterface
2725{
2826 /** @var array<int, mixed> */
2927 public array $ params = [];
@@ -53,6 +51,8 @@ final class DispatchContext
5351 /** @var array<int, AbstractRoute> */
5452 private array $ sideRoutes = [];
5553
54+ private Resolver |null $ resolver = null ;
55+
5656 public function __construct (
5757 public ServerRequestInterface $ request ,
5858 public ResponseFactoryInterface &StreamFactoryInterface $ factory ,
@@ -180,33 +180,6 @@ public function response(): ResponseInterface|null
180180 }
181181 }
182182
183- /** @param array<int, mixed> $params */
184- public function routineCall (
185- string $ type ,
186- string $ method ,
187- Routinable $ routine ,
188- array &$ params ,
189- AbstractRoute $ route ,
190- ): mixed {
191- $ reflection = $ route ->getTargetReflection ($ method );
192-
193- $ callbackParameters = [];
194-
195- if (!$ routine instanceof ParamSynced) {
196- $ callbackParameters = $ params ;
197- } elseif ($ reflection !== null ) {
198- foreach ($ routine ->getParameters () as $ parameter ) {
199- $ callbackParameters [] = $ this ->extractRouteParam (
200- $ reflection ,
201- $ parameter ,
202- $ params ,
203- );
204- }
205- }
206-
207- return $ routine ->{$ type }($ this , $ callbackParameters );
208- }
209-
210183 public function forward (AbstractRoute $ route ): ResponseInterface |null
211184 {
212185 $ this ->route = $ route ;
@@ -230,6 +203,30 @@ public function setResponder(Responder $responder): void
230203 $ this ->responder = $ responder ;
231204 }
232205
206+ public function resolver (): Resolver
207+ {
208+ return $ this ->resolver ??= new Resolver ($ this );
209+ }
210+
211+ public function has (string $ id ): bool
212+ {
213+ return is_a ($ id , ServerRequestInterface::class, true )
214+ || is_a ($ id , ResponseInterface::class, true );
215+ }
216+
217+ public function get (string $ id ): mixed
218+ {
219+ if (is_a ($ id , ServerRequestInterface::class, true )) {
220+ return $ this ->request ;
221+ }
222+
223+ if (is_a ($ id , ResponseInterface::class, true )) {
224+ return $ this ->factory ->createResponse ();
225+ }
226+
227+ return null ;
228+ }
229+
233230 /** @return callable|null The previous error handler, or null */
234231 protected function prepareForErrorForwards (AbstractRoute $ route ): callable |null
235232 {
@@ -310,28 +307,6 @@ protected function forwardToStatusRoute(ResponseInterface $preparedResponse): Re
310307 return null ;
311308 }
312309
313- /** @param array<int, mixed> $params */
314- protected function extractRouteParam (
315- ReflectionFunctionAbstract $ callback ,
316- ReflectionParameter $ routeParam ,
317- array &$ params ,
318- ): mixed {
319- foreach ($ callback ->getParameters () as $ callbackParamReflection ) {
320- if (
321- $ callbackParamReflection ->getName () === $ routeParam ->getName ()
322- && isset ($ params [$ callbackParamReflection ->getPosition ()])
323- ) {
324- return $ params [$ callbackParamReflection ->getPosition ()];
325- }
326- }
327-
328- if ($ routeParam ->isDefaultValueAvailable ()) {
329- return $ routeParam ->getDefaultValue ();
330- }
331-
332- return null ;
333- }
334-
335310 protected function finalizeResponse (mixed $ response ): ResponseInterface
336311 {
337312 return $ this ->responder ()->finalize (
0 commit comments