. 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, _SelectModel() needs to be overridden to select the Model to use. */ abstract 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 Invoke(http\Request $request, http\Response $response) { $this->model = $this->_SelectModel(); $this->model->SetFrom(array_merge( $request->data, $request->data['_POST'], $request->data['_GET'])); parent::Invoke($request, $response); } /*! Returns a new instance of the Model that this object will control. */ abstract protected function _SelectModel(); /*! Gets the data from the model. */ public function DoGet(http\Request $request, http\Response $response) { try { $response->data = $this->model->Fetch(); } catch (ModelException $e) { $response->body = $e->GetMessage(); $response->response_code = http\ResponseCode::NOT_FOUND; } catch (\PDOException $e) { $response->body = $e->GetMessage(); $response->response_code = http\ResponseCode::INTERNAL_SERVER_ERROR; } } /*! Updates an object in the store. */ public function DoPost(http\Request $request, http\Response $response) { try { $this->model->Update(); $response->data = $this->model->Fetch(); } catch (ModelException $e) { $response->body = $e->GetMessage(); $response->response_code = http\ResponseCode::NOT_FOUND; } catch (\PDOException $e) { $response->body = $e->GetMessage(); $response->response_code = http\ResponseCode::INTERNAL_SERVER_ERROR; } } /*! Deletes the object from the store. */ public function DoDelete(http\Request $request, http\Response $response) { try { $this->model->Delete(); } catch (ModelException $e) { $response->body = $e->GetMessage(); $response->response_code = http\ResponseCode::BAD_REQUEST; } catch (\PDOException $e) { $response->body = $e->GetMessage(); $response->response_code = http\ResponseCode::INTERNAL_SERVER_ERROR; } } /*! Updates an object in the store. */ public function DoPut(http\Request $request, http\Response $response) { try { $this->model->Insert(); $response->data = $this->model->Fetch(); } catch (ModelException $e) { $response->body = $e->GetMessage(); $response->response_code = http\ResponseCode::BAD_REQUEST; } catch (\PDOException $e) { $response->body = $e->GetMessage(); $response->response_code = http\ResponseCode::INTERNAL_SERVER_ERROR; } } } class ControllerException extends \Exception {}