FOF30\Hal\Render\Json::render PHP Method

render() public method

Render a HAL document in JSON format
public render ( array $options = [] ) : string
$options array Rendering options. You can currently only set json_options (json_encode options)
return string The JSON representation of the HAL document
    public function render($options = array())
    {
        if (isset($options['data_key'])) {
            $this->_dataKey = $options['data_key'];
        }
        if (isset($options['json_options'])) {
            $jsonOptions = $options['json_options'];
        } else {
            $jsonOptions = 0;
        }
        $serialiseThis = new \stdClass();
        // Add links
        $collection = $this->_document->getLinks();
        $serialiseThis->_links = new \stdClass();
        foreach ($collection as $rel => $links) {
            if (!is_array($links)) {
                $serialiseThis->_links->{$rel} = $this->_getLink($links);
            } else {
                $serialiseThis->_links->{$rel} = array();
                foreach ($links as $link) {
                    array_push($serialiseThis->_links->{$rel}, $this->_getLink($link));
                }
            }
        }
        // Add embedded documents
        $collection = $this->_document->getEmbedded();
        if (!empty($collection)) {
            $serialiseThis->_embedded = new \stdClass();
            foreach ($collection as $rel => $embeddeddocs) {
                $serialiseThis->_embedded->{$rel} = array();
                if (!is_array($embeddeddocs)) {
                    $embeddeddocs = array($embeddeddocs);
                }
                foreach ($embeddeddocs as $embedded) {
                    $renderer = new static($embedded);
                    array_push($serialiseThis->_embedded->{$rel}, $renderer->render($options));
                }
            }
        }
        // Add data
        $data = $this->_document->getData();
        if (is_object($data)) {
            if ($data instanceof DataModel) {
                $data = $data->toArray();
            } else {
                $data = (array) $data;
            }
            if (!empty($data)) {
                foreach ($data as $k => $v) {
                    $serialiseThis->{$k} = $v;
                }
            }
        } elseif (is_array($data)) {
            $serialiseThis->{$this->_dataKey} = $data;
        }
        return json_encode($serialiseThis, $jsonOptions);
    }

Usage Example

Example #1
0
 /**
  * @covers FOF30\Hal\Render\Json::render
  */
 public function testRender()
 {
     $renderer = new Json($this->document);
     // Full render
     $expected = '{"_links":{"prev":{"href":"http:\\/\\/www.example.com\\/test.json?page=1"},"next":{"href":"http:\\/\\/www.example.com\\/test.json?page=3"}},"_embedded":{"detail":["{\\"_links\\":{},\\"_list\\":{\\"detail1_1\\":\\"val1_1\\",\\"detail1_2\\":\\"val1_2\\"}}","{\\"_links\\":{},\\"_list\\":{\\"detail2_1\\":\\"val2_1\\",\\"detail2_2\\":\\"val2_2\\"}}"]},"_list":{"key1":"val1","key2":"val2"}}';
     $rendered = $renderer->render();
     $this->assertEquals($expected, $rendered, 'Line: ' . __LINE__ . '.');
     // Without embedded documents
     $document = $this->getObjectAttribute($renderer, '_document');
     ReflectionHelper::setValue($document, '_embedded', null);
     ReflectionHelper::setValue($renderer, '_document', $document);
     $expected = '{"_links":{"prev":{"href":"http:\\/\\/www.example.com\\/test.json?page=1"},"next":{"href":"http:\\/\\/www.example.com\\/test.json?page=3"}},"_list":{"key1":"val1","key2":"val2"}}';
     $rendered = $renderer->render();
     $this->assertEquals($expected, $rendered, 'Line: ' . __LINE__ . '.');
     // With list of links
     $foo = new Link('http://www.example.com/foo.json?arg=1', false);
     $document->addLink('foo', $foo);
     $foo = new Link('http://www.example.com/foo.json?arg=1', false);
     $document->addLink('foo', $foo);
     ReflectionHelper::setValue($renderer, '_document', $document);
     $expected = '{"_links":{"prev":{"href":"http:\\/\\/www.example.com\\/test.json?page=1"},"next":{"href":"http:\\/\\/www.example.com\\/test.json?page=3"},"foo":{"href":"http:\\/\\/www.example.com\\/foo.json?arg=1"}},"_list":{"key1":"val1","key2":"val2"}}';
     $rendered = $renderer->render();
     $this->assertEquals($expected, $rendered, 'Line: ' . __LINE__ . '.');
 }