Created
February 27, 2012 20:25
-
-
Save zircote/1926802 to your computer and use it in GitHub Desktop.
A Object representation of http://stateless.co/hal_specification.html
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| class Zircote_Json_Hal_Link | |
| { | |
| /** | |
| * | |
| * @var string | |
| */ | |
| protected $_rel; | |
| /** | |
| * | |
| * @var string | |
| */ | |
| protected $_href; | |
| /** | |
| * | |
| * @var string | |
| */ | |
| protected $_title; | |
| public function __construct($href, $rel = 'self', $title = null) | |
| { | |
| $this->setHref($href) | |
| ->setRel($rel) | |
| ->setTitle($title); | |
| } | |
| /** | |
| * @return string | |
| */ | |
| public function getRel () | |
| { | |
| return $this->_rel; | |
| } | |
| /** | |
| * @return string | |
| */ | |
| public function getHref () | |
| { | |
| return $this->_href; | |
| } | |
| /** | |
| * | |
| * @return string | |
| */ | |
| public function getTitle() | |
| { | |
| return $this->_title; | |
| } | |
| /** | |
| * @param string $rel | |
| * @return Zircote_Json_Hal_Resource | |
| */ | |
| public function setRel ($rel) | |
| { | |
| $this->_rel = $rel; | |
| return $this; | |
| } | |
| /** | |
| * @param string $href | |
| * @return Zircote_Json_Hal_Resource | |
| */ | |
| public function setHref ($href) | |
| { | |
| $this->_href = $href; | |
| return $this; | |
| } | |
| /** | |
| * | |
| * @param string $title | |
| * @return Zircote_Json_Hal_Resource | |
| */ | |
| public function setTitle($title) | |
| { | |
| $this->_title = $title; | |
| return $this; | |
| } | |
| /** | |
| * | |
| * @return array | |
| */ | |
| public function toArray() | |
| { | |
| $link = array('href' => $this->getHref()); | |
| if($this->getTitle()){ | |
| $link['title'] = $this->getTitle(); | |
| } | |
| return $link; | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| class Zircote_Json_Hal_Resource | |
| { | |
| protected $_links = array(); | |
| protected $_data = array(); | |
| protected $_embedded = array(); | |
| public function __construct($embedded, Zircote_Json_Hal_Link $self) | |
| { | |
| if($self->getRel() !== 'self'){ | |
| throw new Exception('self link must have $_rel defined as self'); | |
| } | |
| $this->setLink($self); | |
| foreach ($embedded as $k => $embed) { | |
| $this->_data[$k] = $embed; | |
| } | |
| } | |
| /** | |
| * @return Zircote_Json_Hal_Link | |
| */ | |
| public function getSelf() | |
| { | |
| return $this->_links['self']; | |
| } | |
| /** | |
| * @return array | |
| */ | |
| public function getLinks() | |
| { | |
| return $this->_links; | |
| } | |
| /** | |
| * | |
| * @param Zircote_Json_Hal_Link $link | |
| * @return Zircote_Json_Hal_Resource | |
| */ | |
| public function setLink(Zircote_Json_Hal_Link $link) | |
| { | |
| $this->_links[$link->getRel()] = $link; | |
| return $this; | |
| } | |
| /** | |
| * | |
| * @param array $data | |
| * @return Zircote_Json_Hal_Resource | |
| */ | |
| public function setData($rel, $data) | |
| { | |
| $this->_data[$rel] = $data; | |
| return $this; | |
| } | |
| /** | |
| * | |
| * @param Zircote_Json_Hal_Resource $resource | |
| * @return Zircote_Json_Hal_Resource | |
| */ | |
| public function setEmbedded($rel,Zircote_Json_Hal_Resource $resource, $singular = false) | |
| { | |
| if($singular){ | |
| $this->_embedded[$rel] = $resource; | |
| } else { | |
| $this->_embedded[$rel][] = $resource; | |
| } | |
| return $this; | |
| } | |
| /** | |
| * @return array | |
| */ | |
| public function getArrayCopy() | |
| { | |
| $data = array(); | |
| foreach ($this->_links as $rel => $link) { | |
| $data['_links'][$rel] = $link->toArray(); | |
| } | |
| foreach ($this->_data as $key => $value) { | |
| $data[$key] = $value; | |
| } | |
| foreach ($this->_embedded as $rel => $embed) { | |
| $data['_embedded'][$rel] = $this->_recurseEmbedded($embed); | |
| } | |
| return $data; | |
| } | |
| /** | |
| * | |
| * @param mixed $embeded | |
| */ | |
| protected function _recurseEmbedded($embeded) | |
| { | |
| $result = array(); | |
| if($embeded instanceof self){ | |
| $result = $embeded->getArrayCopy(); | |
| } else { | |
| foreach ($embeded as $embed) { | |
| if($embed instanceof self){ | |
| $result[] = $embed->getArrayCopy(); | |
| } | |
| } | |
| } | |
| return $result; | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "_links": { | |
| "self": { "href": "/orders" }, | |
| "next": { "href": "/orders?page=2" }, | |
| "search": { "href": "/orders?id={order_id}" } | |
| }, | |
| "_embedded": { | |
| "order": [ | |
| { | |
| "_links": { | |
| "self": { "href": "/orders/123" }, | |
| "customer": { "href": "/customer/bob", "title": "Bob Jones <bob@jones.com>" } | |
| }, | |
| "total": 30.00, | |
| "currency": "USD", | |
| "status": "shipped", | |
| "placed": "2011-01-16", | |
| "_embedded": { | |
| "basket": { | |
| "_links": { | |
| "self": { "href": "/orders/123/basket" } | |
| }, | |
| "items": [ | |
| { | |
| "sku": "ABC123", | |
| "quantity": 2, | |
| "price": 9.50 | |
| },{ | |
| "sku": "GFZ111", | |
| "quantity": 1, | |
| "price": 11 | |
| } | |
| ] | |
| } | |
| } | |
| },{ | |
| "_links": { | |
| "self": { "href": "/orders/124" }, | |
| "customer": { "href": "/customer/jen", "title": "Jen Harris <jen@internet.com>" } | |
| }, | |
| "total": 20.00, | |
| "currency": "USD", | |
| "status": "processing", | |
| "placed": "2011-01-16", | |
| "_embedded": { | |
| "basket": { | |
| "_links": { | |
| "self": { "href": "/orders/124/basket" } | |
| }, | |
| "items": [ | |
| { | |
| "sku": "KLM222", | |
| "quantity": 1, | |
| "price": 9.00 | |
| },{ | |
| "sku": "HHI50", | |
| "quantity": 1, | |
| "price": 11.00 | |
| } | |
| ] | |
| } | |
| } | |
| } | |
| ] | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| /** | |
| * Zircote_Json_Hal_Link test case. | |
| */ | |
| class Zircote_Json_Hal_LinkTest extends PHPUnit_Framework_TestCase | |
| { | |
| /** | |
| * | |
| * @var Zircote_Json_Hal_Link | |
| */ | |
| private $Zircote_Json_Hal_Link; | |
| /** | |
| * Prepares the environment before running a test. | |
| */ | |
| protected function setUp () | |
| { | |
| parent::setUp(); | |
| // TODO Auto-generated Zircote_Json_Hal_LinkTest::setUp() | |
| // $this->Zircote_Json_Hal_Link = new Zircote_Json_Hal_Link(/* parameters */); | |
| } | |
| /** | |
| * Cleans up the environment after running a test. | |
| */ | |
| protected function tearDown () | |
| { | |
| // TODO Auto-generated Zircote_Json_Hal_LinkTest::tearDown() | |
| $this->Zircote_Json_Hal_Link = null; | |
| parent::tearDown(); | |
| } | |
| /** | |
| * Constructs the test case. | |
| */ | |
| public function __construct () | |
| { | |
| // TODO Auto-generated constructor | |
| } | |
| public function testBuild() | |
| { | |
| $parentRes = new Zircote_Json_Hal_Resource( | |
| array(), new Zircote_Json_Hal_Link('/orders') | |
| ); | |
| $parentRes->setLink(new Zircote_Json_Hal_Link('/orders?page=2', 'next')) | |
| ->setLink(new Zircote_Json_Hal_Link('/orders?id={order_id}', 'search')); | |
| $data = array( | |
| 'total' => '30.00', | |
| 'currency' => 'USD', | |
| 'status' => 'shipped', | |
| 'placed' => '2011-01-16', | |
| ); | |
| $embedded1 = new Zircote_Json_Hal_Resource( | |
| $data, new Zircote_Json_Hal_Link('/orders/123') | |
| ); | |
| $embedded1->setLink( | |
| new Zircote_Json_Hal_Link('/customer/bob','customer','Bob Jones <bob@jones.com>') | |
| ); | |
| $basketItems = array( | |
| array( | |
| 'sku' => 'ABC123', | |
| 'quantity' => 2, | |
| 'price' => '9.50' | |
| ), | |
| array( | |
| 'sku' => 'GFZ111', | |
| 'quantity' => 1, | |
| 'price' => '11.00' | |
| ) | |
| ); | |
| $basket = new Zircote_Json_Hal_Resource( | |
| array(), new Zircote_Json_Hal_Link('/orders/123/basket') | |
| ); | |
| $basket->setData('items', $basketItems); | |
| $embedded1->setEmbedded('basket', $basket, true); | |
| ////////////////////////////////////////////// | |
| $data = array( | |
| 'total' => '20.00', | |
| 'currency' => 'USD', | |
| 'status' => 'processing', | |
| 'placed' => '2011-01-16', | |
| ); | |
| $embedded2 = new Zircote_Json_Hal_Resource( | |
| $data, new Zircote_Json_Hal_Link('/orders/124') | |
| ); | |
| $embedded2->setLink( | |
| new Zircote_Json_Hal_Link('/customer/jen','customer','Jen Harris <jen@internet.com>') | |
| ); | |
| ///////////////////////////////////// | |
| $basketItems = array( | |
| array( | |
| 'sku' => 'KLM222', | |
| 'quantity' => 1, | |
| 'price' => "9.00" | |
| ), | |
| array( | |
| 'sku' => 'HHI50', | |
| 'quantity' => 1, | |
| 'price' => "11.00" | |
| ) | |
| ); | |
| $basket2 = new Zircote_Json_Hal_Resource( | |
| array(), new Zircote_Json_Hal_Link('/orders/124/basket') | |
| ); | |
| $basket2->setData('items', $basketItems); | |
| $embedded2->setEmbedded('basket', $basket2, true); | |
| $parentRes | |
| ->setEmbedded('order', $embedded1) | |
| ->setEmbedded('order', $embedded2); | |
| // print_r($parentRes->getArrayCopy()); | |
| $actual = Zend_Json::decode(Zend_Json::encode($parentRes->getArrayCopy())); | |
| // echo Zend_Json::prettyPrint(Zend_Json::encode($parentRes->getArrayCopy())); | |
| $JSON =<<<EOF | |
| { | |
| "_links": { | |
| "self": { "href": "/orders" }, | |
| "next": { "href": "/orders?page=2" }, | |
| "search": { "href": "/orders?id={order_id}" } | |
| }, | |
| "_embedded": { | |
| "order": [ | |
| { | |
| "_links": { | |
| "self": { "href": "/orders/123" }, | |
| "customer": { "href": "/customer/bob", "title": "Bob Jones <bob@jones.com>" } | |
| }, | |
| "total": "30.00", | |
| "currency": "USD", | |
| "status": "shipped", | |
| "placed": "2011-01-16", | |
| "_embedded": { | |
| "basket": { | |
| "_links": { | |
| "self": { "href": "/orders/123/basket" } | |
| }, | |
| "items": [ | |
| { | |
| "sku": "ABC123", | |
| "quantity": 2, | |
| "price": "9.50" | |
| },{ | |
| "sku": "GFZ111", | |
| "quantity": 1, | |
| "price": 11 | |
| } | |
| ] | |
| } | |
| } | |
| },{ | |
| "_links": { | |
| "self": { "href": "/orders/124" }, | |
| "customer": { "href": "/customer/jen", "title": "Jen Harris <jen@internet.com>" } | |
| }, | |
| "total": "20.00", | |
| "currency": "USD", | |
| "status": "processing", | |
| "placed": "2011-01-16", | |
| "_embedded": { | |
| "basket": { | |
| "_links": { | |
| "self": { "href": "/orders/124/basket" } | |
| }, | |
| "items": [ | |
| { | |
| "sku": "KLM222", | |
| "quantity": 1, | |
| "price": "9.00" | |
| },{ | |
| "sku": "HHI50", | |
| "quantity": 1, | |
| "price": 11.00 | |
| } | |
| ] | |
| } | |
| } | |
| } | |
| ] | |
| } | |
| } | |
| EOF; | |
| $expected = Zend_Json::decode($JSON); | |
| $this->assertEquals($expected, $actual); | |
| } | |
| } |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Reference