diff options
| author | Bharat Mediratta <bharat@menalto.com> | 2009-05-27 15:07:27 -0700 | 
|---|---|---|
| committer | Bharat Mediratta <bharat@menalto.com> | 2009-05-27 15:07:27 -0700 | 
| commit | 28b41056e3ea962dce1ad017a3c0a60252195e7a (patch) | |
| tree | 82c11956bb13969e6c8ddeb39ccfce7ae70786ca /modules/gallery/controllers/rest.php | |
| parent | 2e285cf3ecac742193457347ecb5c2d1121a1052 (diff) | |
Restructure things so that the application is now just another module.
Kohana makes this type of transition fairly straightforward in that
all controllers/helpers/etc are still located in the cascading
filesystem without any extra effort, except that I've temporarily
added a hack to force modules/gallery into the module path.
Rename what's left of "core" to be "application" so that it conforms
more closely to the Kohana standard (basically, just
application/config/config.php which is the minimal thing that you need
in the application directory)
There's still considerable work left to be done here.
Diffstat (limited to 'modules/gallery/controllers/rest.php')
| -rw-r--r-- | modules/gallery/controllers/rest.php | 183 | 
1 files changed, 183 insertions, 0 deletions
| diff --git a/modules/gallery/controllers/rest.php b/modules/gallery/controllers/rest.php new file mode 100644 index 00000000..11a6bbac --- /dev/null +++ b/modules/gallery/controllers/rest.php @@ -0,0 +1,183 @@ +<?php defined("SYSPATH") or die("No direct script access."); +/** + * Gallery - a web based photo album viewer and editor + * Copyright (C) 2000-2009 Bharat Mediratta + * + * 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 2 of the License, or (at + * your option) 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA  02110-1301, USA. + */ +/** + * This abstract controller makes it easy to create a RESTful controller.  To use it, create a + * subclass which defines the resource type and implements get/post/put/delete methods, like this: + * + * class Comment_Controller extends REST_Controller { + *   protected $resource_type = "comment";  // this tells REST which model to use + * + *   public function _index() { + *     // Handle GET request to /controller + *   } + * + *   public function _show(ORM $comment) { + *     // Handle GET request to /comments/{comment_id} + *   } + * + *   public function _update(ORM $comment) { + *     // Handle PUT request to /comments/{comment_id} + *   } + * + *   public function _create(ORM $comment) { + *     // Handle POST request to /comments + *   } + * + *   public function _delete(ORM $comment) { + *     // Handle DELETE request to /comments/{comments_id} + *   } + * + *   public function _form_add($parameters) { + *     // Handle GET request to /form/add/comments + *     // Show a form for creating a new comment + *   } + * + *   public function _form_edit(ORM $comment) { + *     // Handle GET request to /form/edit/comments + *     // Show a form for editing an existing comment + *   } + * + * A request to http://example.com/gallery3/comments/3 will result in a call to + * REST_Controller::__call(3) which will load up the comment associated with id 3.  If there's + * no such comment, it returns a 404.  Otherwise, it will then delegate to + * Comment_Controller::get() with the ORM instance as an argument. + */ +class REST_Controller extends Controller { +  protected $resource_type = null; + +  public function __construct() { +    if ($this->resource_type == null) { +      throw new Exception("@todo ERROR_MISSING_RESOURCE_TYPE"); +    } +    parent::__construct(); +  } + +  /** +   * Handle dispatching for all REST controllers. +   */ +  public function __call($function, $args) { +    // If no parameter was provided after the controller name (eg "/albums") then $function will +    // be set to "index".  Otherwise, $function is the first parameter, and $args are all +    // subsequent parameters. +    $request_method = rest::request_method(); +    if ($function == "index" && $request_method == "get") { +      return $this->_index(); +    } + +    $resource = ORM::factory($this->resource_type, (int)$function); +    if (!$resource->loaded && $request_method != "post") { +      return Kohana::show_404(); +    } + +    if ($request_method != "get") { +      access::verify_csrf(); +    } + +    switch ($request_method) { +    case "get": +      return $this->_show($resource); + +    case "put": +      return $this->_update($resource); + +    case "delete": +      return $this->_delete($resource); + +    case "post": +      return $this->_create($resource); +    } +  } + +  /* We're editing an existing item, load it from the database. */ +  public function form_edit($resource_id) { +    if ($this->resource_type == null) { +      throw new Exception("@todo ERROR_MISSING_RESOURCE_TYPE"); +    } + +    // @todo this needs security checks +    $resource = ORM::factory($this->resource_type, $resource_id); +    if (!$resource->loaded) { +      return Kohana::show_404(); +    } + +    return $this->_form_edit($resource); +  } + +  /* We're adding a new item, pass along any additional parameters. */ +  public function form_add($parameters) { +    return $this->_form_add($parameters); +  } + +  /** +   * Perform a GET request on the controller root +   * (e.g. http://www.example.com/gallery3/comments) +   */ +  public function _index() { +    throw new Exception("@todo _create NOT IMPLEMENTED"); +  } + +  /** +   * Perform a POST request on this resource +   * @param ORM $resource the instance of this resource type +   */ +  public function _create($resource) { +    throw new Exception("@todo _create NOT IMPLEMENTED"); +  } + +  /** +   * Perform a GET request on this resource +   * @param ORM $resource the instance of this resource type +   */ +  public function _show($resource) { +    throw new Exception("@todo _show NOT IMPLEMENTED"); +  } + +  /** +   * Perform a PUT request on this resource +   * @param ORM $resource the instance of this resource type +   */ +  public function _update($resource) { +    throw new Exception("@todo _update NOT IMPLEMENTED"); +  } + +  /** +   * Perform a DELETE request on this resource +   * @param ORM $resource the instance of this resource type +   */ +  public function _delete($resource) { +    throw new Exception("@todo _delete NOT IMPLEMENTED"); +  } + +  /** +   * Present a form for adding a new resource +   * @param string part of the URI after the controller name +   */ +  public function _form_add($parameter) { +    throw new Exception("@todo _form_add NOT IMPLEMENTED"); +  } + +  /** +   * Present a form for editing an existing resource +   * @param ORM $resource the resource container for instances of this resource type +   */ +  public function _form_edit($resource) { +    throw new Exception("@todo _form_edit NOT IMPLEMENTED"); +  } +} | 
