Skip to content
This repository has been archived by the owner on May 16, 2022. It is now read-only.

Latest commit

 

History

History

active_resource

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

= Active Resource

Active Resource (ARes) connects business objects and Representational State Transfer (REST) web services. It implements object-relational mapping for REST web services to provide transparent proxying capabilities between a client (AkActiveResource) and a RESTful service (which is provided by Simply RESTful routing in action_pack/routes/resources.php AkResources).

== Philosophy

Active Resource attempts to provide a coherent wrapper object-relational mapping for REST web services. It follows the same philosophy as Active Record, in that one of its prime aims is to reduce the amount of code needed to map to these resources. This is made possible by relying on a number of code- and protocol-based conventions that make it easy for Active Resource to infer complex relations and structures. These conventions are outlined in detail in the documentation for AkActiveResource.

== Overview

Model classes are mapped to remote REST resources by Active Resource much the same way Active Record maps model classes to database tables. When a request is made to a remote resource, a REST XML request is generated, transmitted, and the result received and serialized into a usable PHP object.

=== Configuration and Usage

Putting Active Resource to use is very similar to Active Record. It's as simple as creating a model class that inherits from AkActiveResource and providing a site class variable to it:

class Person extends AkActiveResource { public $site = "http://api.people.com/"; }

Now the Person class is REST enabled and can invoke REST services very similarly to how Active Record invokes lifecycle methods that operate against a persistent store.

Find a person with id = 1

$Ryan = $Person->find(1); $Person->exists(1); #=> true

As you can see, the methods are quite similar to Active Record's methods for dealing with database records. But rather than dealing directly with a database record, you're dealing with HTTP resources (which may or may not be database records).

==== Protocol

Active Resource is built on a standard XML format for requesting and submitting resources over HTTP. It mirrors the RESTful routing built into Action Controller but will also work with any other REST service that properly implements the protocol. REST uses HTTP, but unlike "typical" web applications, it makes use of all the verbs available in the HTTP specification:

  • GET requests are used for finding and retrieving resources.
  • POST requests are used to create new resources.
  • PUT requests are used to update existing resources.
  • DELETE requests are used to delete resources.

For more information on how this protocol works with Active Resource, see the AkActiveResource documentation; for more general information on REST web services, see the article here[http://en.wikipedia.org/wiki/Representational_State_Transfer].

==== Find

Find requests use the GET method and expect the XML form of whatever resource/resources is/are being requested. So, for a request for a single element, the XML of that item is expected in response:

Expects a response of

1

value1

..

$Ryan = $Person->find(1);

The XML document that is received is used to build a new object of type Person, with each XML element becoming an attribute on the object.

$Ryan instanceof Person; #=> true $Ryan->attribute1; #=> 'value1'

Any complex element (one that contains other elements) becomes its own object:

With this response:

1

value1

value2

$Ryan = $Person->find(1); $Ryan->complex #=> <$Person->Complex->xxxxx> $Ryan->complex->attribute2 #=> 'value2'

Collections can also be requested in a similar fashion

Expects a response of

1Ryan

2Jim

$People = $Person->find('all'); $People->first(); #=> <Person::xxx 'first' => 'Ryan' ...> $People->last(); #=> <Person::xxx 'first' => 'Jim' ...>

==== Create

Creating a new resource submits the XML form of the resource as the body of the request and expects a 'Location' header in the response with the RESTful URL location of the newly created resource. The id of the newly created resource is parsed out of the Location response header and automatically set as the id of the ARes object.

Ryan

is submitted as the body on

when save is called on a new Person object. An empty response is

is expected with a 'Location' header value:

Response (201): Location: http://api.people.com/people/2

$Ryan = new Person(array('first => 'Ryan')); $Ryan->isNewRecord(); #=> true $Ryan->save(); #=> true $Ryan->isNewRecord(); #=> false $Ryan->id; #=> 2

==== Update

'save' is also used to update an existing resource - and follows the same protocol as creating a resource with the exception that no response headers are needed - just an empty response when the update on the server side was successful.

Ryan

is submitted as the body on

when save is called on an existing Person object. An empty response is

is expected with code (204)

$Ryan = $Person->find(1); $Ryan->first; #=> 'Ryan' $Ryan->first = 'Rizzle' $Ryan->save(); #=> true

==== Delete

Destruction of a resource can be invoked as a class and instance method of the resource.

A request is made to

for both of these forms. An empty response with

is expected with response code (200)

$Ryan = $Person->find(1); $Ryan->destroy(); #=> true $Ryan->exists(); #=> false $Person->delete(2); #=> true $Person->exists(2); #=> false

You can find more usage information in the AkActiveResource documentation.