diff options
-rw-r--r-- | src/Router/Runner.php | 6 | ||||
-rw-r--r-- | src/Router/Runner/Controller.php | 35 | ||||
-rw-r--r-- | src/Router/Runner/RunnerFactory.php | 8 |
3 files changed, 29 insertions, 20 deletions
diff --git a/src/Router/Runner.php b/src/Router/Runner.php index 87f082e..f4ececd 100644 --- a/src/Router/Runner.php +++ b/src/Router/Runner.php @@ -4,7 +4,6 @@ namespace Jasny\Router; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ResponseInterface; -use Jasny\Router\Route; /** * A runner can be invoked in order to run the action specified in a route @@ -30,13 +29,12 @@ abstract class Runner */ public function __invoke(ServerRequestInterface $request, ResponseInterface $response, $next = null) { - $response = $this->run($request, $response); + $newResponse = $this->run($request, $response); if (isset($next)) { - $response = call_user_func($next, $request, $response); + $response = call_user_func($next, $request, $newResponse); } return $response; } } - diff --git a/src/Router/Runner/Controller.php b/src/Router/Runner/Controller.php index 56cf2b5..779459a 100644 --- a/src/Router/Runner/Controller.php +++ b/src/Router/Runner/Controller.php @@ -7,13 +7,28 @@ use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ResponseInterface; /** - * Description of Controller - * - * @author arnold + * Run a route using a controller */ class Controller extends Runner { /** + * Create a controller object + * + * @param string $name + * @return + */ + protected function instantiateController($name) + { + $class = \Jasny\studlycase($name); + + if (!class_exists($class)) { + throw new \RuntimeException("Can not route to controller '$class': class not exists"); + } + + return new $class(); + } + + /** * Route to a controller * * @param ServerRequestInterface $request @@ -23,18 +38,14 @@ class Controller extends Runner public function run(ServerRequestInterface $request, ResponseInterface $response) { $route = $request->getAttribute('route'); - $class = !empty($route->controller) ? $route->controller : null; + $name = !empty($route->controller) ? $route->controller : null; - if (!class_exists($class)) { - throw new \RuntimeException("Can not route to controller '$class': class not exists"); - } - - if (!method_exists($class, '__invoke')) { + $controller = $this->instantiateController($name); + + if (!method_exists($controller, '__invoke')) { throw new \RuntimeException("Can not route to controller '$class': class does not have '__invoke' method"); } - - $controller = new $class($route); - + return $controller($request, $response); } } diff --git a/src/Router/Runner/RunnerFactory.php b/src/Router/Runner/RunnerFactory.php index e32d2cc..66df37b 100644 --- a/src/Router/Runner/RunnerFactory.php +++ b/src/Router/Runner/RunnerFactory.php @@ -3,6 +3,7 @@ namespace Jasny\Router\Runner; use Jasny\Router\Route; +use Jasny\Router\Runner; /** * Factory of Runner instances @@ -18,11 +19,11 @@ class RunnerFactory public function __invoke(Route $route) { if (isset($route->controller)) { - $class = Controller::class; + $class = Runner\Controller::class; } elseif (isset($route->fn)) { - $class = Callback::class; + $class = Runner\Callback::class; } elseif (isset($route->file)) { - $class = PhpScript::class; + $class = Runner\PhpScript::class; } else { throw new \InvalidArgumentException("Route has neither 'controller', 'fn' or 'file' defined"); } @@ -30,4 +31,3 @@ class RunnerFactory return new $class(); } } - |