Add data\Controller
authorRobert Sesek <rsesek@google.com>
Sat, 30 Jul 2011 21:47:14 +0000 (17:47 -0400)
committerRobert Sesek <rsesek@google.com>
Sat, 30 Jul 2011 21:47:14 +0000 (17:47 -0400)
data/controller.php [new file with mode: 0644]

diff --git a/data/controller.php b/data/controller.php
new file mode 100644 (file)
index 0000000..47e5990
--- /dev/null
@@ -0,0 +1,95 @@
+<?php
+// Hoplite
+// Copyright (c) 2011 Blue Static
+// 
+// This program is free software: you can redistribute it and/or modify it
+// under the terms of the GNU General Public License as published by the Free
+// Software Foundation, either version 3 of the License, or any later version.
+// 
+// This program is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+// more details.
+//
+// You should have received a copy of the GNU General Public License along with
+// this program.  If not, see <http://www.gnu.org/licenses/>.
+
+namespace hoplite\data;
+use \hoplite\http as http;
+
+require_once HOPLITE_ROOT . '/http/response_code.php';
+require_once HOPLITE_ROOT . '/http/rest_action.php';
+
+/*!
+  A Controller is a RESTful http\Action that is used to bind a data\Model to a
+  web interface. Subclass this in order to perform business logic such as
+  validation and authentication.
+
+  This class is semi-abstract in that it cannot be used directly. At minimum,
+  FilterRequest() needs to be overridden to select the Model to use.
+*/
+class Controller extends http\RestAction
+{
+  /*! @var hoplite\data\Model The object that will be operated on. */
+  protected $model = NULL;
+
+  /*! Selects the Model object. */
+  public function FilterRequest(http\Request $request, http\Response $response)
+  {
+    // Example:
+    // $this->model = new webapp\models\User();
+    throw new ControllerException('Model not selected');
+  }
+
+  /*! Gets the data from the model. */
+  protected function _DoGet(http\Request $request, http\Response $response)
+  {
+    $this->model->SetFrom($request->data);
+    try {
+      $response->data = $this->model->Fetch();
+    } catch (ModelException $e) {
+      $response->data['message'] = $e->GetMessage();
+      $response->response_code = http\ResponseCode::NOT_FOUND;
+    }
+  }
+
+  /*! Updates an object in the store. */
+  protected function _DoPost(http\Request $request, http\Response $response)
+  {
+    $this->model->SetFrom($request->data);
+    try {
+      $this->model->Update();
+      $response->data = $this->model->Fetch();
+    } catch (ModelException $e) {
+      $response->data['message'] = $e->GetMessage();
+      $response->response_code = http\ResponseCode::NOT_FOUND;
+    }
+  }
+
+  /*! Deletes the object from the store. */
+  protected function _DoDelete(http\Request $request, http\Response $response)
+  {
+    $this->model->SetFrom($request->data);
+    try {
+      $this->model->Delete();
+    } catch (ModelException $e) {
+      $response->data['message'] = $e->GetMessage();
+      $response->response_code = http\ResponseCode::BAD_REQUEST;
+    }
+  }
+
+  /*! Updates an object in the store. */
+  protected function _DoPut(http\Request $request, http\Response $response)
+  {
+    $this->model->SetFrom($request->data);
+    try {
+      $this->model->Insert();
+      $response->data = $this->model->Fetch();
+    } catch (ModelException $e) {
+      $response->data['message'] = $e->GetMessage();
+      $response->response_code = http\ResponseCode::BAD_REQUEST;
+    }
+  }
+}
+
+class ControllerException extends \Exception {}