diff options
Diffstat (limited to 'src/Router/Runner')
-rw-r--r-- | src/Router/Runner/Callback.php | 2 | ||||
-rw-r--r-- | src/Router/Runner/Controller.php | 39 | ||||
-rw-r--r-- | src/Router/Runner/PhpScript.php | 27 | ||||
-rw-r--r-- | src/Router/Runner/RunnerFactory.php | 33 |
4 files changed, 51 insertions, 50 deletions
diff --git a/src/Router/Runner/Callback.php b/src/Router/Runner/Callback.php index 7f4c457..8fa8c0e 100644 --- a/src/Router/Runner/Callback.php +++ b/src/Router/Runner/Callback.php @@ -29,6 +29,6 @@ class Callback extends Runner throw new \RuntimeException("'fn' property of route shoud be a callable"); } - return call_user_func($callback, $request, $response); + return $callback($request, $response); } } diff --git a/src/Router/Runner/Controller.php b/src/Router/Runner/Controller.php index 56cf2b5..caca48f 100644 --- a/src/Router/Runner/Controller.php +++ b/src/Router/Runner/Controller.php @@ -7,13 +7,34 @@ 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 { /** + * Get class name from controller name + * + * @param string $name + * @return string + */ + protected function getClass($name) + { + return strstr($name, '-') ? \Jasny\studlycase($name) : $name; + } + + /** + * Instantiate a controller object + * @codeCoverageIgnore + * + * @param string $class + * @return callable|object + */ + protected function instantiate($class) + { + return new $class(); + } + + /** * Route to a controller * * @param ServerRequestInterface $request @@ -23,18 +44,20 @@ 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; + $class = $this->getClass($name); + if (!class_exists($class)) { throw new \RuntimeException("Can not route to controller '$class': class not exists"); } - + if (!method_exists($class, '__invoke')) { throw new \RuntimeException("Can not route to controller '$class': class does not have '__invoke' method"); } - - $controller = new $class($route); - + + $controller = $this->instantiate($class); + return $controller($request, $response); } } diff --git a/src/Router/Runner/PhpScript.php b/src/Router/Runner/PhpScript.php index d223bd7..51480c5 100644 --- a/src/Router/Runner/PhpScript.php +++ b/src/Router/Runner/PhpScript.php @@ -10,7 +10,18 @@ use Psr\Http\Message\ResponseInterface; * Route to a PHP script */ class PhpScript extends Runner -{ +{ + /** + * Include a file + * @param type $file + * @param ServerRequestInterface $request + * @param ResponseInterface $response + */ + protected function includeScript($file, ServerRequestInterface $request, ResponseInterface $response) + { + return include $file; + } + /** * Route to a file * @@ -23,16 +34,16 @@ class PhpScript extends Runner $route = $request->getAttribute('route'); $file = !empty($route->file) ? ltrim($route->file, '/') : ''; - if (!file_exists($file)) { - throw new \RuntimeException("Failed to route using '$file': File '$file' doesn't exist."); - } - if ($file[0] === '~' || strpos($file, '..') !== false) { - throw new \RuntimeException("Won't route using '$file': '~', '..' are not allowed in filename."); + throw new \RuntimeException("Won't route to '$file': '~', '..' are not allowed in filename"); } - $result = include $file; + if (!file_exists($file)) { + throw new \RuntimeException("Failed to route using '$file': File doesn't exist"); + } + + $result = $this->includeScript($file, $request, $response); - return $result === true ? $response : $result; + return $result === true || $result === 1 ? $response : $result; } } diff --git a/src/Router/Runner/RunnerFactory.php b/src/Router/Runner/RunnerFactory.php deleted file mode 100644 index e32d2cc..0000000 --- a/src/Router/Runner/RunnerFactory.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php - -namespace Jasny\Router\Runner; - -use Jasny\Router\Route; - -/** - * Factory of Runner instances - */ -class RunnerFactory -{ - /** - * Create Runner instance - * - * @param Route $route - * @return Runner - */ - public function __invoke(Route $route) - { - if (isset($route->controller)) { - $class = Controller::class; - } elseif (isset($route->fn)) { - $class = Callback::class; - } elseif (isset($route->file)) { - $class = PhpScript::class; - } else { - throw new \InvalidArgumentException("Route has neither 'controller', 'fn' or 'file' defined"); - } - - return new $class(); - } -} - |