From 5d72a564d12dfa7efc9fe4d9e1d2570090587f0f 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 | 21 ++++++++++++++++++--- src/ControllerInvoker.php | 22 ++++++++++++++++++++-- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/Bridge.php b/src/Bridge.php index 127cdc9..f28dcc7 100644 --- a/src/Bridge.php +++ b/src/Bridge.php @@ -39,7 +39,13 @@ public static function create(?ContainerInterface $container = null): App return $app; } - private static function createControllerInvoker(ContainerInterface $container): ControllerInvoker + /** + * Create an invoker with the default resolvers. + * + * @param ContainerInterface $container + * @return Invoker + */ + protected static function createInvoker(ContainerInterface $container): Invoker { $resolvers = [ // Inject parameters by name first @@ -50,8 +56,17 @@ 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. + * + * @param ContainerInterface $container + * @return ControllerInvoker + */ + 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..6689042 100644 --- a/src/ControllerInvoker.php +++ b/src/ControllerInvoker.php @@ -42,10 +42,28 @@ 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 The response from the callable. + * @return ResponseInterface|string The processed response + */ + protected function processResponse($response) + { + return $response; + } + + /** + * Inject route arguments into the request. + * + * @param ServerRequestInterface $request + * @param array $routeArguments + * @return ServerRequestInterface + */ + protected static function injectRouteArguments(ServerRequestInterface $request, array $routeArguments): ServerRequestInterface { $requestWithArgs = $request; foreach ($routeArguments as $key => $value) {