Skip to content
This repository was archived by the owner on Sep 16, 2021. It is now read-only.

Commit c52fe3e

Browse files
committed
Use handler instead of Subscriber for serializing resources
1 parent 45c4292 commit c52fe3e

File tree

12 files changed

+111
-102
lines changed

12 files changed

+111
-102
lines changed

Controller/ResourceController.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,13 @@ public function resourceAction($repositoryName, $path)
4343
$repository = $this->registry->get($repositoryName);
4444
$resource = $repository->get('/' . $path);
4545

46+
$context = SerializationContext::create();
47+
$context->enableMaxDepthChecks();
48+
$context->setSerializeNull(true);
4649
$json = $this->serializer->serialize(
4750
$resource,
4851
'json',
49-
SerializationContext::create()->enableMaxDepthChecks()
52+
$context
5053
);
5154

5255
return new Response($json);

Enhancer/EnhancerInterface.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,5 @@ interface EnhancerInterface
3131
* @param Context Serialization context
3232
* @param Resource The resource being serialized
3333
*/
34-
public function enhance(Context $context, Resource $resource);
34+
public function enhance(array $data, Context $context, Resource $resource);
3535
}

Enhancer/PayloadEnhancer.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@ class PayloadEnhancer implements EnhancerInterface
2424
/**
2525
* {@inheritDoc}
2626
*/
27-
public function enhance(Context $context, Resource $resource)
27+
public function enhance(array $data, Context $context, Resource $resource)
2828
{
2929
$visitor = $context->getVisitor();
30-
$visitor->addData('payload', $context->accept($resource->getPayload()));
30+
$data['payload'] = $context->accept($resource->getPayload());
31+
return $data;
3132
}
3233
}

Enhancer/SonataAdminEnhancer.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public function __construct(Pool $pool, UrlGeneratorInterface $urlGenerator)
3636
/**
3737
* {@inheritDoc}
3838
*/
39-
public function enhance(Context $context, Resource $resource)
39+
public function enhance(array $data, Context $context, Resource $resource)
4040
{
4141
$object = $resource->getPayload();
4242

@@ -60,8 +60,8 @@ public function enhance(Context $context, Resource $resource)
6060
$links[$routeName] = $url;
6161
}
6262

63-
$visitor->addData('_admin_label', $admin->getLabel());
64-
$visitor->addData('_admin_links', $links);
63+
$data['_admin_label'] = $admin->getLabel();
64+
$data['_admin_links'] = $links;
6565
}
6666
}
6767

Resources/config/serializer.xml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@
1414
</parameters>
1515

1616
<services>
17+
<service id="cmf_resource_rest.serializer.handler.resource" class="%cmf_resource_rest.serializer.handler.resource.class%">
18+
<argument type="service" id="cmf_resource.registry" />
19+
<argument type="service" id="cmf_resource_rest.registry.payload_alias" />
20+
<argument type="service" id="cmf_resource_rest.registry.enhancer" />
21+
<tag name="jms_serializer.subscribing_handler"/>
22+
</service>
1723

1824
<service id="cmf_resource_rest.serializer.handler.resource_collection" class="%cmf_resource_rest.serializer.handler.resource_collection.class%">
1925
<tag name="jms_serializer.subscribing_handler"/>
@@ -28,9 +34,6 @@
2834
</service>
2935

3036
<service id="cmf_resource_rest.serializer.subscriber.resource" class="%cmf_resource_rest.serializer.subscriber.resource.class%">
31-
<argument type="service" id="cmf_resource.registry" />
32-
<argument type="service" id="cmf_resource_rest.registry.payload_alias" />
33-
<argument type="service" id="cmf_resource_rest.registry.enhancer" />
3437
<tag name="jms_serializer.event_subscriber" />
3538
</service>
3639

Resources/config/serializer/PhpcrOdmResource.xml

Lines changed: 0 additions & 12 deletions
This file was deleted.

Resources/config/serializer/PhpcrResource.xml

Lines changed: 0 additions & 12 deletions
This file was deleted.

Serializer/EventSubscriber/ResourceSubscriber.php

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -29,27 +29,9 @@
2929
*/
3030
class ResourceSubscriber implements EventSubscriberInterface
3131
{
32-
private $registry;
33-
private $payloadAliasRegistry;
34-
private $enhancerRegistry;
35-
36-
public function __construct(
37-
RepositoryRegistryInterface $registry,
38-
PayloadAliasRegistry $payloadAliasRegistry,
39-
EnhancerRegistry $enhancerRegistry
40-
) {
41-
$this->registry = $registry;
42-
$this->payloadAliasRegistry = $payloadAliasRegistry;
43-
$this->enhancerRegistry = $enhancerRegistry;
44-
}
45-
4632
public static function getSubscribedEvents()
4733
{
4834
return array(
49-
array(
50-
'event' => Events::POST_SERIALIZE,
51-
'method' => 'onPostSerialize',
52-
),
5335
array(
5436
'event' => Events::PRE_SERIALIZE,
5537
'method' => 'onPreSerialize',
@@ -68,34 +50,4 @@ public function onPreSerialize(PreSerializeEvent $event)
6850
$event->setType('Puli\Repository\Api\Resource\Resource');
6951
}
7052
}
71-
72-
/**
73-
* @param PreSerializeEvent $event
74-
*/
75-
public function onPostSerialize(ObjectEvent $event)
76-
{
77-
$object = $event->getObject();
78-
79-
if (!$object instanceof Resource) {
80-
return;
81-
}
82-
83-
$visitor = $event->getVisitor();
84-
$context = $event->getContext();
85-
$repositoryAlias = $this->registry->getRepositoryAlias($object->getRepository());
86-
87-
$visitor->addData('repository_alias', $repositoryAlias);
88-
$visitor->addData('repository_type', $this->registry->getRepositoryType($object->getRepository()));
89-
$visitor->addData('payload_alias', $this->payloadAliasRegistry->getPayloadAlias($object));
90-
$visitor->addData('payload_type', $object->getPayloadType());
91-
$visitor->addData('path', $object->getPath());
92-
$visitor->addData('repository_path', $object->getRepositoryPath());
93-
$visitor->addData('children', $context->accept($object->listChildren()));
94-
95-
$enhancers = $this->enhancerRegistry->getEnhancers($repositoryAlias);
96-
97-
foreach ($enhancers as $enhancer) {
98-
$enhancer->enhance($context, $object);
99-
}
100-
}
10153
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
<?php
2+
/*
3+
* This file is part of the Symfony CMF package.
4+
*
5+
* (c) 2011-2014 Symfony CMF
6+
*
7+
* For the full copyright and license information, please view the LICENSE
8+
* file that was distributed with this source code.
9+
*/
10+
11+
namespace Symfony\Cmf\Bundle\ResourceRestBundle\Serializer\Handler;
12+
13+
use JMS\Serializer\Handler\SubscribingHandlerInterface;
14+
use JMS\Serializer\GraphNavigator;
15+
use JMS\Serializer\JsonSerializationVisitor;
16+
use JMS\Serializer\Context;
17+
use PHPCR\NodeInterface;
18+
use Puli\Repository\Api\Resource\Resource;
19+
use Symfony\Cmf\Component\Resource\RepositoryRegistryInterface;
20+
use Symfony\Cmf\Bundle\ResourceRestBundle\Registry\PayloadAliasRegistry;
21+
use Symfony\Cmf\Bundle\ResourceRestBundle\Registry\EnhancerRegistry;
22+
23+
/**
24+
* Handle PHPCR resource serialization
25+
*
26+
* @author Daniel Leech <[email protected]>
27+
*/
28+
class ResourceHandler implements SubscribingHandlerInterface
29+
{
30+
private $registry;
31+
private $payloadAliasRegistry;
32+
private $enhancerRegistry;
33+
34+
public function __construct(
35+
RepositoryRegistryInterface $registry,
36+
PayloadAliasRegistry $payloadAliasRegistry,
37+
EnhancerRegistry $enhancerRegistry
38+
) {
39+
$this->registry = $registry;
40+
$this->payloadAliasRegistry = $payloadAliasRegistry;
41+
$this->enhancerRegistry = $enhancerRegistry;
42+
}
43+
44+
public static function getSubscribingMethods()
45+
{
46+
return array(
47+
array(
48+
'event' => GraphNavigator::DIRECTION_SERIALIZATION,
49+
'format' => 'json',
50+
'type' => 'Puli\Repository\Api\Resource\Resource',
51+
'method' => 'serializeResource',
52+
),
53+
);
54+
}
55+
56+
/**
57+
* @param JsonSerializationVisitor $visitor
58+
* @param NodeInterface $resourceInterface
59+
* @param array $type
60+
* @param Context $context
61+
*/
62+
public function serializeResource(
63+
JsonSerializationVisitor $visitor,
64+
Resource $resource,
65+
array $type,
66+
Context $context
67+
) {
68+
$data = array();
69+
70+
$repositoryAlias = $this->registry->getRepositoryAlias($resource->getRepository());
71+
72+
$data['repository_alias'] = $repositoryAlias;
73+
$data['repository_type'] = $this->registry->getRepositoryType($resource->getRepository());
74+
$data['payload_alias'] = $this->payloadAliasRegistry->getPayloadAlias($resource);
75+
$data['payload_type'] = $resource->getPayloadType();
76+
$data['path'] = $resource->getPath();
77+
$data['repository_path'] = $resource->getRepositoryPath();
78+
$data['children'] = $context->accept($resource->listChildren());
79+
80+
$enhancers = $this->enhancerRegistry->getEnhancers($repositoryAlias);
81+
82+
foreach ($enhancers as $enhancer) {
83+
$data = $enhancer->enhance($data, $context, $resource);
84+
}
85+
86+
$context->accept($data);
87+
}
88+
}
89+

Tests/Features/resource_api_decorator.feature

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
Feature: Resource decoration
1+
Feature: Resource enhancement
22
In order to add additional data to resource REST responses
33
As a developer
44
I need to be able to register enhancers which do this
@@ -46,11 +46,6 @@ Feature: Resource decoration
4646
"phpcr:classparents": [],
4747
"title": "Article 1",
4848
"body": "This is my article"
49-
},
50-
"_links": {
51-
"self": {
52-
"href": "\/api\/phpcr_repo\/foo"
53-
}
5449
}
5550
}
5651
"""

0 commit comments

Comments
 (0)