From dedf7f591fe3b3c3493201e3e938e837f9a26bb2 Mon Sep 17 00:00:00 2001 From: Andrew Nicols Date: Thu, 20 Jun 2024 00:02:38 +0800 Subject: [PATCH] Improve ease of extention In our usage we need to extend the ControllerInvoker to have responses normalised from a generic Payload into a standard Response. To make this easier it would be helpful if some private methods were instead protected and the Invoker fetching the default resolver chain were separated out from the creation of the ControllerInvoker. Fixes #105 --- src/Bridge.php | 15 ++++++++++++--- src/ControllerInvoker.php | 21 ++++++++++++++++++--- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/Bridge.php b/src/Bridge.php index 127cdc9..6ae28df 100644 --- a/src/Bridge.php +++ b/src/Bridge.php @@ -39,7 +39,10 @@ public static function create(?ContainerInterface $container = null): App return $app; } - private static function createControllerInvoker(ContainerInterface $container): ControllerInvoker + /** + * Create an invoker with the default resolvers. + */ + protected static function createInvoker(ContainerInterface $container): Invoker { $resolvers = [ // Inject parameters by name first @@ -50,8 +53,14 @@ private static function createControllerInvoker(ContainerInterface $container): new DefaultValueResolver, ]; - $invoker = new Invoker(new ResolverChain($resolvers), $container); + return new Invoker(new ResolverChain($resolvers), $container); + } - return new ControllerInvoker($invoker); + /** + * Create a controller invoker with the default resolvers. + */ + protected static function createControllerInvoker(ContainerInterface $container): ControllerInvoker + { + return new ControllerInvoker(self::createInvoker($container)); } } diff --git a/src/ControllerInvoker.php b/src/ControllerInvoker.php index bc1a632..98e114c 100644 --- a/src/ControllerInvoker.php +++ b/src/ControllerInvoker.php @@ -24,7 +24,6 @@ public function __construct(InvokerInterface $invoker) * @param ServerRequestInterface $request The request object. * @param ResponseInterface $response The response object. * @param array $routeArguments The route's placeholder arguments - * @return ResponseInterface|string The response from the callable. */ public function __invoke( callable $callable, @@ -42,10 +41,26 @@ public function __invoke( // Inject the attributes defined on the request $parameters += $request->getAttributes(); - return $this->invoker->call($callable, $parameters); + return $this->processResponse($this->invoker->call($callable, $parameters)); } - private static function injectRouteArguments(ServerRequestInterface $request, array $routeArguments): ServerRequestInterface + /** + * Allow for child classes to process the response. + * + * @param ResponseInterface|string $response The response from the callable. + * @return ResponseInterface|string The processed response + */ + protected function processResponse($response) + { + return $response; + } + + /** + * Inject route arguments into the request. + * + * @param array $routeArguments + */ + protected static function injectRouteArguments(ServerRequestInterface $request, array $routeArguments): ServerRequestInterface { $requestWithArgs = $request; foreach ($routeArguments as $key => $value) {