Skip to content

Commit f1fc490

Browse files
committed
Adds beforeSerialize and afterSerialize events
1 parent 9d91f04 commit f1fc490

File tree

9 files changed

+101
-2
lines changed

9 files changed

+101
-2
lines changed

plugins/collection-view/README.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,3 +157,17 @@ return [
157157
]
158158
];
159159
```
160+
161+
## Events
162+
163+
CollectionView dispatches two events:
164+
165+
### MixerApi.CollectionView.beforeSerialize
166+
167+
The event contains the Serializer as the subject and the `type` of data (i.e. "xml" or "json").
168+
169+
### MixerApi.CollectionView.afterSerialize
170+
171+
The event contains the Serializer as the subject, the `type` of data (i.e. "xml" or "json") and the serialized data
172+
as `data`.
173+

plugins/collection-view/src/Serializer.php

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
use Cake\Core\Configure;
88
use Cake\Datasource\Paging\PaginatedResultSet;
99
use Cake\Datasource\ResultSetInterface;
10+
use Cake\Event\Event;
11+
use Cake\Event\EventManager;
1012
use Cake\Http\ServerRequest;
1113
use Cake\Utility\Xml;
1214
use Cake\View\Helper\PaginatorHelper;
@@ -66,12 +68,21 @@ public function __construct(mixed $serialize, ?ServerRequest $request = null, ?P
6668
*/
6769
public function asJson(int $jsonOptions = 0): string
6870
{
71+
EventManager::instance()->dispatch(new Event('MixerApi.CollectionView.beforeSerialize', $this, [
72+
'type' => 'json',
73+
]));
74+
6975
$json = json_encode($this->data, $jsonOptions);
7076

7177
if ($json === false) {
7278
throw new RuntimeException(json_last_error_msg(), json_last_error());
7379
}
7480

81+
EventManager::instance()->dispatch(new Event('MixerApi.CollectionView.afterSerialize', $this, [
82+
'type' => 'json',
83+
'data' => $json,
84+
]));
85+
7586
return $json;
7687
}
7788

@@ -85,7 +96,18 @@ public function asJson(int $jsonOptions = 0): string
8596
*/
8697
public function asXml(array $options, string $rootNode = 'response'): string
8798
{
88-
return Xml::fromArray([$rootNode => $this->data], $options)->saveXML();
99+
EventManager::instance()->dispatch(new Event('MixerApi.CollectionView.beforeSerialize', $this, [
100+
'type' => 'xml',
101+
]));
102+
103+
$xml = Xml::fromArray([$rootNode => $this->data], $options)->saveXML();
104+
105+
EventManager::instance()->dispatch(new Event('MixerApi.CollectionView.afterSerialize', $this, [
106+
'type' => 'xml',
107+
'data' => $xml,
108+
]));
109+
110+
return $xml;
89111
}
90112

91113
/**

plugins/collection-view/tests/TestCase/SerializerTest.php

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
use Cake\Controller\ComponentRegistry;
66
use Cake\Datasource\FactoryLocator;
77
use Cake\Datasource\Paging\PaginatedResultSet;
8+
use Cake\Event\EventList;
9+
use Cake\Event\EventManager;
810
use Cake\Http\Response;
911
use Cake\Http\ServerRequest;
1012
use Cake\Routing\RouteBuilder;
@@ -20,7 +22,7 @@
2022
class SerializerTest extends TestCase
2123
{
2224
/**
23-
* @var string[]
25+
* @inheritdoc
2426
*/
2527
public array $fixtures = [
2628
'plugin.MixerApi/CollectionView.Actors',
@@ -34,6 +36,8 @@ public function setUp(): void
3436

3537
public function test_as_json(): void
3638
{
39+
EventManager::instance()->trackEvents(true)->setEventList(new EventList());
40+
3741
$actor = FactoryLocator::get('Table')->get('Actors');
3842

3943
$result = new PaginatedResultSet($actor->find()->limit(1)->all(), [
@@ -85,6 +89,8 @@ public function test_as_json(): void
8589

8690
$obj = json_decode($json);
8791
$this->assertIsObject($obj);
92+
$this->assertEventFired('MixerApi.CollectionView.beforeSerialize');
93+
$this->assertEventFired('MixerApi.CollectionView.afterSerialize');
8894
$this->assertEquals(20, $obj->collection->count);
8995
$this->assertEquals(60, $obj->collection->total);
9096
$this->assertEquals('/', $obj->collection->url);
@@ -93,6 +99,7 @@ public function test_as_json(): void
9399

94100
public function test_as_xml(): void
95101
{
102+
EventManager::instance()->trackEvents(true)->setEventList(new EventList());
96103
$actor = FactoryLocator::get('Table')->get('Actors');
97104

98105
$result = new PaginatedResultSet($actor->find()->limit(1)->all(), [
@@ -142,6 +149,8 @@ public function test_as_xml(): void
142149
$this->assertIsString($xml);
143150

144151
$simpleXml = simplexml_load_string($xml);
152+
$this->assertEventFired('MixerApi.CollectionView.beforeSerialize');
153+
$this->assertEventFired('MixerApi.CollectionView.afterSerialize');
145154
$this->assertInstanceOf(SimpleXMLElement::class, $simpleXml);
146155
$this->assertEquals('/', $simpleXml->collection->url);
147156
$this->assertInstanceOf(SimpleXMLElement::class, $simpleXml->data);

plugins/hal-view/README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,3 +245,15 @@ use Cake\Http\ServerRequest;
245245
use Cake\View\Helper\PaginatorHelper;
246246
$json = (new JsonSerializer($data, new ServerRequest(), new PaginatorHelper()))->asJson();
247247
```
248+
249+
## Events
250+
251+
HalView dispatches two events:
252+
253+
### MixerApi.HalView.beforeSerialize
254+
255+
The event contains the Serializer as the subject.
256+
257+
### MixerApi.HalView.afterSerialize
258+
259+
The event contains the Serializer as the subject and the serialized data as `data`.

plugins/hal-view/src/JsonSerializer.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@
66
use Cake\Datasource\EntityInterface;
77
use Cake\Datasource\Paging\PaginatedResultSet;
88
use Cake\Datasource\ResultSetInterface;
9+
use Cake\Event\Event;
10+
use Cake\Event\EventManager;
911
use Cake\Http\ServerRequest;
1012
use Cake\ORM\Entity;
1113
use Cake\Utility\Inflector;
1214
use Cake\View\Helper\PaginatorHelper;
15+
use Cake\View\View;
1316
use MixerApi\Core\View\SerializableAssociation;
1417
use ReflectionClass;
1518
use ReflectionException;
@@ -63,12 +66,18 @@ public function __construct(mixed $serialize, ?ServerRequest $request = null, ?P
6366
*/
6467
public function asJson(int $jsonOptions = 0): string
6568
{
69+
EventManager::instance()->dispatch(new Event('MixerApi.HalView.beforeSerialize', $this));
70+
6671
$json = json_encode($this->data, $jsonOptions);
6772

6873
if ($json === false) {
6974
throw new RuntimeException(json_last_error_msg(), json_last_error());
7075
}
7176

77+
EventManager::instance()->dispatch(new Event('MixerApi.HalView.afterSerialize', $this, [
78+
'data' => $json,
79+
]));
80+
7281
return $json;
7382
}
7483

plugins/hal-view/tests/TestCase/JsonSerializerTest.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
use Cake\Datasource\FactoryLocator;
66
use Cake\Datasource\Paging\PaginatedResultSet;
7+
use Cake\Event\EventList;
8+
use Cake\Event\EventManager;
79
use Cake\Http\Response;
810
use Cake\Http\ServerRequest;
911
use Cake\ORM\Table;
@@ -71,6 +73,8 @@ public function setUp(): void
7173

7274
public function test_collection(): void
7375
{
76+
EventManager::instance()->trackEvents(true)->setEventList(new EventList());
77+
7478
$actor = FactoryLocator::get('Table')->get('Actors');
7579
$result = new PaginatedResultSet($actor->find()->applyOptions(['contain' => 'Films'])->limit(1)->all(), [
7680
'sort' => null,
@@ -101,6 +105,8 @@ public function test_collection(): void
101105

102106
$this->assertIsString($json);
103107
$this->assertIsObject(json_decode($json));
108+
$this->assertEventFired('MixerApi.HalView.beforeSerialize');
109+
$this->assertEventFired('MixerApi.HalView.afterSerialize');
104110
}
105111

106112
public function test_item(): void

plugins/json-ld-view/README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,3 +345,16 @@ use Cake\Http\ServerRequest;
345345
use Cake\View\Helper\PaginatorHelper;
346346
$json = (new JsonSerializer($data, new ServerRequest(), new PaginatorHelper()))->asJson();
347347
```
348+
349+
## Events
350+
351+
JsonLdView dispatches two events:
352+
353+
### MixerApi.JsonLdView.beforeSerialize
354+
355+
The event contains the Serializer as the subject.
356+
357+
### MixerApi.JsonLdView.afterSerialize
358+
359+
The event contains the Serializer as the subject and the serialized data as `data`.
360+

plugins/json-ld-view/src/JsonSerializer.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
use Cake\Datasource\EntityInterface;
88
use Cake\Datasource\Paging\PaginatedResultSet;
99
use Cake\Datasource\ResultSetInterface;
10+
use Cake\Event\Event;
11+
use Cake\Event\EventManager;
1012
use Cake\Http\ServerRequest;
1113
use Cake\ORM\Entity;
1214
use Cake\View\Helper\PaginatorHelper;
@@ -82,12 +84,18 @@ public function __construct(mixed $serialize, ?ServerRequest $request = null, ?P
8284
*/
8385
public function asJson(int $jsonOptions = 0): string
8486
{
87+
EventManager::instance()->dispatch(new Event('MixerApi.JsonLdView.beforeSerialize', $this));
88+
8589
$json = json_encode($this->data, $jsonOptions);
8690

8791
if ($json === false) {
8892
throw new RuntimeException(json_last_error_msg(), json_last_error());
8993
}
9094

95+
EventManager::instance()->dispatch(new Event('MixerApi.JsonLdView.afterSerialize', $this, [
96+
'data' => $json,
97+
]));
98+
9199
return $json;
92100
}
93101

plugins/json-ld-view/tests/TestCase/JsonSerializerTest.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
use Cake\Datasource\FactoryLocator;
66
use Cake\Datasource\Paging\PaginatedResultSet;
7+
use Cake\Event\EventList;
8+
use Cake\Event\EventManager;
79
use Cake\Http\Response;
810
use Cake\Http\ServerRequest;
911
use Cake\ORM\Table;
@@ -66,6 +68,8 @@ public function setUp(): void
6668
*/
6769
public function test_collection(string $resultType): void
6870
{
71+
EventManager::instance()->trackEvents(true)->setEventList(new EventList());
72+
6973
/** @var Table $actor */
7074
$actor = FactoryLocator::get('Table')->get('Actors');
7175
$result = $actor->find()->contain('Films')->limit(1)->all();
@@ -96,6 +100,8 @@ public function test_collection(string $resultType): void
96100

97101
$this->assertIsString($json);
98102
$this->assertIsObject(json_decode($json));
103+
$this->assertEventFired('MixerApi.JsonLdView.beforeSerialize');
104+
$this->assertEventFired('MixerApi.JsonLdView.afterSerialize');
99105
}
100106

101107
public static function dataProviderForCollectionTypes(): array

0 commit comments

Comments
 (0)