summaryrefslogtreecommitdiffstats
path: root/src/Router/Runner
diff options
context:
space:
mode:
Diffstat (limited to 'src/Router/Runner')
-rw-r--r--src/Router/Runner/Callback.php2
-rw-r--r--src/Router/Runner/Controller.php39
-rw-r--r--src/Router/Runner/PhpScript.php27
-rw-r--r--src/Router/Runner/RunnerFactory.php33
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();
- }
-}
-