diff --git a/Slim/App.php b/Slim/App.php index b29acecac..21392fe67 100644 --- a/Slim/App.php +++ b/Slim/App.php @@ -21,6 +21,7 @@ use Slim\Http\Body; use Slim\Http\Request; use Slim\Interfaces\Http\EnvironmentInterface; +use Slim\Interfaces\InvocationStrategyInterface; use Slim\Interfaces\RouteGroupInterface; use Slim\Interfaces\RouteInterface; use Slim\Interfaces\RouterInterface; @@ -370,12 +371,9 @@ public function __invoke(ServerRequestInterface $request, ResponseInterface $res { $routeInfo = $this->container->get('router')->dispatch($request); if ($routeInfo[0] === Dispatcher::FOUND) { - // URL decode the named arguments from the router - $attributes = $routeInfo[2]; - foreach ($attributes as $k => $v) { - $request = $request->withAttribute($k, urldecode($v)); - } - return $routeInfo[1]($request, $response, []); + /** @var InvocationStrategyInterface $handler */ + $handler = $this->container->get('foundHandler'); + return $handler->invoke($this->container, $routeInfo, $request, $response); } elseif ($routeInfo[0] === Dispatcher::METHOD_NOT_ALLOWED) { /** @var callable $notAllowedHandler */ $notAllowedHandler = $this->container->get('notAllowedHandler'); diff --git a/Slim/Container.php b/Slim/Container.php index ec06809f8..db965f676 100644 --- a/Slim/Container.php +++ b/Slim/Container.php @@ -17,12 +17,14 @@ use Slim\Handlers\Error; use Slim\Handlers\NotFound; use Slim\Handlers\NotAllowed; +use Slim\Handlers\Strategies\RequestResponse; use Slim\Http\Environment; use Slim\Http\Headers; use Slim\Http\Request; use Slim\Http\Response; use Slim\Interfaces\CallableResolverInterface; use Slim\Interfaces\Http\EnvironmentInterface; +use Slim\Interfaces\InvocationStrategyInterface; use Slim\Interfaces\RouterInterface; /** @@ -36,6 +38,7 @@ * - request: an instance of \Psr\Http\Message\ServerRequestInterface * - response: an instance of \Psr\Http\Message\ResponseInterface * - router: an instance of \Slim\Interfaces\RouterInterface + * - foundHandler: an instance of \Slim\Interfaces\InvocationStrategyInterface * - errorHandler: a callable with the signature: function($request, $response, $exception) * - notFoundHandler: a callable with the signature: function($request, $response) * - notAllowedHandler: a callable with the signature: function($request, $response, $allowedHttpMethods) @@ -144,6 +147,18 @@ function ($c) { return new Router(); }; + /** + * This service MUST return a SHARED instance + * of \Slim\Interfaces\InvocationStrategyInterface. + * + * @param Container $c + * + * @return InvocationStrategyInterface + */ + $this['foundHandler'] = function ($c) { + return new RequestResponse(); + }; + /** * This service MUST return a callable * that accepts three arguments: diff --git a/Slim/Handlers/Strategies/RequestResponse.php b/Slim/Handlers/Strategies/RequestResponse.php new file mode 100644 index 000000000..c4250679b --- /dev/null +++ b/Slim/Handlers/Strategies/RequestResponse.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Slim\Handlers\Strategies; + + +use Interop\Container\ContainerInterface; +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\ServerRequestInterface; +use Slim\Interfaces\InvocationStrategyInterface; + +class RequestResponse implements InvocationStrategyInterface +{ + + /** + * @param ContainerInterface $container + * @param array $route + * @param ServerRequestInterface $request + * @param ResponseInterface $response + * + * @return mixed + */ + public function invoke( + ContainerInterface $container, + array $route, + ServerRequestInterface $request, + ResponseInterface $response + ) { + foreach ($route[2] as $k => $v) { + $request = $request->withAttribute($k, urldecode($v)); + } + return $route[1]($request, $response, []); + } +} diff --git a/Slim/Handlers/Strategies/RequestResponseArgs.php b/Slim/Handlers/Strategies/RequestResponseArgs.php new file mode 100644 index 000000000..37ca24fd0 --- /dev/null +++ b/Slim/Handlers/Strategies/RequestResponseArgs.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Slim\Handlers\Strategies; + + +use Interop\Container\ContainerInterface; +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\ServerRequestInterface; +use Slim\Interfaces\InvocationStrategyInterface; + +class RequestResponseArgs implements InvocationStrategyInterface +{ + + /** + * @param ContainerInterface $container + * @param array $route + * @param ServerRequestInterface $request + * @param ResponseInterface $response + * + * @return mixed + */ + public function invoke(ContainerInterface $container, array $route, ServerRequestInterface $request, ResponseInterface $response) + { + $arguments = [$request, $response]; + foreach ($route[2] as $k => $v) { + $decoded = urldecode($v); + $request = $request->withAttribute($k, $decoded); + array_push($arguments, $decoded); + } + return call_user_func_array($route[1], $arguments); + } +} diff --git a/Slim/Interfaces/InvocationStrategyInterface.php b/Slim/Interfaces/InvocationStrategyInterface.php new file mode 100644 index 000000000..ff0e8ba15 --- /dev/null +++ b/Slim/Interfaces/InvocationStrategyInterface.php @@ -0,0 +1,27 @@ +