summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/Controller.php67
-rw-r--r--tests/ControllerTest.php26
2 files changed, 93 insertions, 0 deletions
diff --git a/src/Controller.php b/src/Controller.php
new file mode 100644
index 0000000..8dfa176
--- /dev/null
+++ b/src/Controller.php
@@ -0,0 +1,67 @@
+<?php
+
+namespace Jasny;
+
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Message\ResponseInterface;
+
+/**
+ * Controller
+ */
+abstract class Controller
+{
+ /**
+ * Server request
+ * @var ServerRequestInterface
+ **/
+ protected $request = null;
+
+ /**
+ * Response
+ * @var ResponseInterface
+ **/
+ protected $response = null;
+
+ /**
+ * Run the controller
+ *
+ * @return ResponseInterface
+ */
+ abstract public function run();
+
+ /**
+ * Get request, set for controller
+ *
+ * @return ServerRequestInterface
+ */
+ public function getRequest()
+ {
+ return $this->request;
+ }
+
+ /**
+ * Get response. set for controller
+ *
+ * @return ResponseInterface
+ */
+ public function getResponse()
+ {
+ return $this->response;
+ }
+
+ /**
+ * Run the controller as function
+ *
+ * @param ServerRequestInterface $request
+ * @param ResponseInterface $response
+ * @return ResponseInterface
+ */
+ public function __invoke(ServerRequestInterface $request, ResponseInterface $response)
+ {
+ $this->request = $request;
+ $this->response = $response;
+
+ return $this->run();
+ }
+}
+
diff --git a/tests/ControllerTest.php b/tests/ControllerTest.php
new file mode 100644
index 0000000..9a4caef
--- /dev/null
+++ b/tests/ControllerTest.php
@@ -0,0 +1,26 @@
+<?php
+
+use Jasny\Controller;
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Message\ResponseInterface;
+
+class ControllerTest extends PHPUnit_Framework_TestCase
+{
+ /**
+ * Test running controller
+ */
+ public function testInvoke()
+ {
+ $controller = $this->getMockBuilder(Controller::class)->disableOriginalConstructor()->getMockForAbstractClass();
+ $request = $this->createMock(ServerRequestInterface::class);
+ $response = $this->createMock(ResponseInterface::class);
+
+ $controller->expects($this->once())->method('run')->will($this->returnValue($response));
+
+ $result = $controller($request, $response);
+
+ $this->assertEquals($response, $result, "Invoking controller should return 'ResponseInterface' instance");
+ $this->assertEquals($response, $controller->getResponse(), "Can not get 'ResponseInterface' instance from controller");
+ $this->assertEquals($request, $controller->getRequest(), "Can not get 'ServerRequestInterface' instance from controller");
+ }
+}