summaryrefslogtreecommitdiffstats
path: root/src/Router/Runner/Controller.php
diff options
context:
space:
mode:
Diffstat (limited to 'src/Router/Runner/Controller.php')
-rw-r--r--src/Router/Runner/Controller.php39
1 files changed, 31 insertions, 8 deletions
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);
}
}