Skip to content

Instantly share code, notes, and snippets.

@zircote
Created February 27, 2012 20:25
Show Gist options
  • Select an option

  • Save zircote/1926802 to your computer and use it in GitHub Desktop.

Select an option

Save zircote/1926802 to your computer and use it in GitHub Desktop.
A Object representation of http://stateless.co/hal_specification.html
<?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;
}
}
{
"_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
}
]
}
}
}
]
}
}
<?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);
}
}
@zircote

zircote commented Feb 28, 2012

Copy link
Copy Markdown
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment