Skip to content
This repository was archived by the owner on Jan 29, 2020. It is now read-only.

Commit 948285c

Browse files
committed
Merge branch 'hotfix/3-datetime-rendering'
Close #27 Fixes #3
2 parents 5259cda + e5812fa commit 948285c

File tree

5 files changed

+118
-0
lines changed

5 files changed

+118
-0
lines changed

CHANGELOG.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,32 @@ All notable changes to this project will be documented in this file, in reverse
44

55
Versions prior to 0.4.0 were released as the package "weierophinney/hal".
66

7+
## 0.6.2 - 2018-01-03
8+
9+
### Added
10+
11+
- Nothing.
12+
13+
### Changed
14+
15+
- [#27](https://github.com/zendframework/zend-expressive-hal/pull/27) modifies
16+
the `XmlRenderer` to raise an exception when attempting to render objects that
17+
are not serializable to strings.
18+
19+
### Deprecated
20+
21+
- Nothing.
22+
23+
### Removed
24+
25+
- Nothing.
26+
27+
### Fixed
28+
29+
- [#27](https://github.com/zendframework/zend-expressive-hal/pull/27) adds
30+
handling for `DateTime` and string serializable objects to the `XmlRenderer`,
31+
allowing them to be rendered.
32+
733
## 0.6.1 - 2017-12-12
834

935
### Added

src/Exception/InvalidResourceValueException.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,16 @@ public static function fromValue($value) : self
2020
HalResource::class
2121
));
2222
}
23+
24+
/**
25+
* @param object $object
26+
*/
27+
public static function fromObject($object) : self
28+
{
29+
return new self(sprintf(
30+
'Encountered object of type "%s" when serializing %s instance; unable to serialize',
31+
get_class($object),
32+
HalResource::class
33+
));
34+
}
2335
}

src/Renderer/XmlRenderer.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
namespace Zend\Expressive\Hal\Renderer;
99

10+
use DateTimeInterface;
1011
use DOMDocument;
1112
use DOMNode;
1213
use Zend\Expressive\Hal\HalResource;
@@ -112,6 +113,11 @@ private function createResourceElement(DOMDocument $doc, string $name, $data)
112113
return $doc->createElement($name, $data);
113114
}
114115

116+
if (is_object($data)) {
117+
$data = $this->createDataFromObject($data);
118+
return $doc->createElement($name, $data);
119+
}
120+
115121
if (! is_array($data)) {
116122
throw Exception\InvalidResourceValueException::fromValue($data);
117123
}
@@ -142,4 +148,25 @@ private function createNodeTree(DOMDocument $doc, DOMNode $node, array $data) :
142148

143149
return $node;
144150
}
151+
152+
/**
153+
* @todo Detect JsonSerializable, and pass to
154+
* json_decode(json_encode($object), true), passing the final value
155+
* back to createResourceElement()?
156+
* @param object $object
157+
* @throws Exception\InvalidResourceValueException if unable to serialize
158+
* the data to a string.
159+
*/
160+
private function createDataFromObject($object) : string
161+
{
162+
if ($object instanceof DateTimeInterface) {
163+
return $object->format('c');
164+
}
165+
166+
if (! method_exists($object, '__toString')) {
167+
throw Exception\InvalidResourceValueException::fromObject($object);
168+
}
169+
170+
return (string) $object;
171+
}
145172
}

test/Renderer/XmlRendererTest.php

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,13 @@
77

88
namespace ZendTest\Expressive\Hal\Renderer;
99

10+
use DateTime;
1011
use PHPUnit\Framework\TestCase;
12+
use stdClass;
13+
use Zend\Expressive\Hal\HalResource;
14+
use Zend\Expressive\Hal\Link;
1115
use Zend\Expressive\Hal\Renderer\XmlRenderer;
16+
use ZendTest\Expressive\Hal\TestAsset\StringSerializable;
1217

1318
class XmlRendererTest extends TestCase
1419
{
@@ -61,4 +66,34 @@ public function testRendersExpectedXmlPayload()
6166

6267
$this->assertSame($expected, $renderer->render($resource));
6368
}
69+
70+
/**
71+
* @see https://github.com/zendframework/zend-expressive-hal/issues/3
72+
*/
73+
public function testCanRenderPhpDateTimeInstances()
74+
{
75+
$dateTime = new DateTime('now');
76+
$resource = new HalResource([
77+
'date' => $dateTime,
78+
]);
79+
$resource = $resource->withLink(new Link('self', '/example'));
80+
81+
$renderer = new XmlRenderer();
82+
$xml = $renderer->render($resource);
83+
$this->assertContains($dateTime->format('c'), $xml);
84+
}
85+
86+
public function testCanRenderObjectsThatImplementToString()
87+
{
88+
$instance = new StringSerializable();
89+
90+
$resource = new HalResource([
91+
'key' => $instance,
92+
]);
93+
$resource = $resource->withLink(new Link('self', '/example'));
94+
95+
$renderer = new XmlRenderer();
96+
$xml = $renderer->render($resource);
97+
$this->assertContains((string) $instance, $xml);
98+
}
6499
}

test/TestAsset/StringSerializable.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
/**
3+
* @see https://github.com/zendframework/zend-expressive-hal for the canonical source repository
4+
* @copyright Copyright (c) 2017 Zend Technologies USA Inc. (https://www.zend.com)
5+
* @license https://github.com/zendframework/zend-expressive-hal/blob/master/LICENSE.md New BSD License
6+
*/
7+
8+
declare(strict_types=1);
9+
10+
namespace ZendTest\Expressive\Hal\TestAsset;
11+
12+
class StringSerializable
13+
{
14+
public function __toString()
15+
{
16+
return __METHOD__;
17+
}
18+
}

0 commit comments

Comments
 (0)