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 ;
1917use function rawurldecode ;
2018use function rtrim ;
2119use function set_error_handler ;
20+ use function sprintf ;
2221use function strtolower ;
2322use function strtoupper ;
2423
2524/** Internal routing context wrapping a PSR-7 server request */
26- final class DispatchContext
25+ final class DispatchContext implements ContainerInterface
2726{
2827 /** @var array<int, mixed> */
2928 public array $ params = [];
@@ -53,6 +52,8 @@ final class DispatchContext
5352 /** @var array<int, AbstractRoute> */
5453 private array $ sideRoutes = [];
5554
55+ private Resolver |null $ resolver = null ;
56+
5657 public function __construct (
5758 public ServerRequestInterface $ request ,
5859 public ResponseFactoryInterface &StreamFactoryInterface $ factory ,
@@ -180,33 +181,6 @@ public function response(): ResponseInterface|null
180181 }
181182 }
182183
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-
210184 public function forward (AbstractRoute $ route ): ResponseInterface |null
211185 {
212186 $ this ->route = $ route ;
@@ -230,6 +204,30 @@ public function setResponder(Responder $responder): void
230204 $ this ->responder = $ responder ;
231205 }
232206
207+ public function resolver (): Resolver
208+ {
209+ return $ this ->resolver ??= new Resolver ($ this );
210+ }
211+
212+ public function has (string $ id ): bool
213+ {
214+ return is_a ($ id , ServerRequestInterface::class, true )
215+ || is_a ($ id , ResponseInterface::class, true );
216+ }
217+
218+ public function get (string $ id ): mixed
219+ {
220+ if (is_a ($ id , ServerRequestInterface::class, true )) {
221+ return $ this ->request ;
222+ }
223+
224+ if (is_a ($ id , ResponseInterface::class, true )) {
225+ return $ this ->ensureResponseDraft ();
226+ }
227+
228+ throw new NotFoundException (sprintf ('No entry found for "%s" ' , $ id ));
229+ }
230+
233231 /** @return callable|null The previous error handler, or null */
234232 protected function prepareForErrorForwards (AbstractRoute $ route ): callable |null
235233 {
@@ -310,28 +308,6 @@ protected function forwardToStatusRoute(ResponseInterface $preparedResponse): Re
310308 return null ;
311309 }
312310
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-
335311 protected function finalizeResponse (mixed $ response ): ResponseInterface
336312 {
337313 return $ this ->responder ()->finalize (
0 commit comments