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

Commit 82891a4

Browse files
committed
Reosurce children not serializing
1 parent 70d7994 commit 82891a4

12 files changed

+124
-26
lines changed

Controller/ResourceController.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Hateoas\UrlGenerator\UrlGeneratorInterface;
88
use JMS\Serializer\SerializerInterface;
99
use JMS\Serializer\SerializationContext;
10+
use Symfony\Cmf\Bundle\ResourceRestBundle\Serializer\Jms\Exclusion\GlobalDepthExclusionStrategy;
1011

1112
class ResourceController
1213
{
@@ -46,6 +47,7 @@ public function resourceAction($repositoryName, $path)
4647
$context = SerializationContext::create();
4748
$context->enableMaxDepthChecks();
4849
$context->setSerializeNull(true);
50+
$context->addExclusionStrategy(new GlobalDepthExclusionStrategy(2));
4951
$json = $this->serializer->serialize(
5052
$resource,
5153
'json',

Registry/PayloadAliasRegistry.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use Symfony\Cmf\Component\Resource\RepositoryRegistryInterface;
1717
use Puli\Repository\Api\Resource\Resource;
1818
use Puli\Repository\Api\ResourceRepository;
19+
use Puli\Repository\Api\Resource\CompositeResource;
1920

2021
/**
2122
* Registry for resource payload aliases
@@ -65,7 +66,10 @@ public function getPayloadAlias(Resource $resource)
6566
$resource->getRepository()
6667
);
6768

68-
$type = $resource->getPayloadType();
69+
$type = null;
70+
if ($resource instanceof CmfResource) {
71+
$type = $resource->getPayloadType();
72+
}
6973

7074
if (null === $type) {
7175
return null;

Resources/config/serializer.xml

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,40 +5,45 @@
55
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
66

77
<parameters>
8-
<parameter key="cmf_resource_rest.serializer.handler.resource_collection.class">Symfony\Cmf\Bundle\ResourceRestBundle\Serializer\Handler\ResourceCollectionHandler</parameter>
9-
<parameter key="cmf_resource_rest.serializer.handler.phpcr_node.class">Symfony\Cmf\Bundle\ResourceRestBundle\Serializer\Handler\PhpcrNodeHandler</parameter>
10-
<parameter key="cmf_resource_rest.serializer.handler.resource.class">Symfony\Cmf\Bundle\ResourceRestBundle\Serializer\Handler\ResourceHandler</parameter>
11-
<parameter key="cmf_resource_rest.serializer.subscriber.phpcr_node.class">Symfony\Cmf\Bundle\ResourceRestBundle\Serializer\EventSubscriber\PhpcrNodeSubscriber</parameter>
12-
<parameter key="cmf_resource_rest.serializer.subscriber.resource_collection.class">Symfony\Cmf\Bundle\ResourceRestBundle\Serializer\EventSubscriber\ResourceCollectionSubscriber</parameter>
13-
<parameter key="cmf_resource_rest.serializer.subscriber.resource.class">Symfony\Cmf\Bundle\ResourceRestBundle\Serializer\EventSubscriber\ResourceSubscriber</parameter>
8+
<parameter key="cmf_resource_rest.serializer.jms.handler.resource_collection.class">Symfony\Cmf\Bundle\ResourceRestBundle\Serializer\Jms\Handler\ResourceCollectionHandler</parameter>
9+
<parameter key="cmf_resource_rest.serializer.jms.handler.phpcr_node.class">Symfony\Cmf\Bundle\ResourceRestBundle\Serializer\Jms\Handler\PhpcrNodeHandler</parameter>
10+
<parameter key="cmf_resource_rest.serializer.jms.handler.resource.class">Symfony\Cmf\Bundle\ResourceRestBundle\Serializer\Jms\Handler\ResourceHandler</parameter>
11+
<parameter key="cmf_resource_rest.serializer.jms.subscriber.phpcr_node.class">Symfony\Cmf\Bundle\ResourceRestBundle\Serializer\Jms\EventSubscriber\PhpcrNodeSubscriber</parameter>
12+
<parameter key="cmf_resource_rest.serializer.jms.subscriber.resource_collection.class">Symfony\Cmf\Bundle\ResourceRestBundle\Serializer\Jms\EventSubscriber\ResourceCollectionSubscriber</parameter>
13+
<parameter key="cmf_resource_rest.serializer.jms.subscriber.resource.class">Symfony\Cmf\Bundle\ResourceRestBundle\Serializer\Jms\EventSubscriber\ResourceSubscriber</parameter>
1414
</parameters>
1515

1616
<services>
17-
<service id="cmf_resource_rest.serializer.handler.resource" class="%cmf_resource_rest.serializer.handler.resource.class%">
17+
<service id="cmf_resource_rest.serializer.jms.handler.resource" class="%cmf_resource_rest.serializer.jms.handler.resource.class%">
1818
<argument type="service" id="cmf_resource.registry" />
1919
<argument type="service" id="cmf_resource_rest.registry.payload_alias" />
2020
<argument type="service" id="cmf_resource_rest.registry.enhancer" />
2121
<tag name="jms_serializer.subscribing_handler"/>
2222
</service>
2323

24-
<service id="cmf_resource_rest.serializer.handler.resource_collection" class="%cmf_resource_rest.serializer.handler.resource_collection.class%">
24+
<service id="cmf_resource_rest.serializer.jms.handler.resource_collection" class="%cmf_resource_rest.serializer.jms.handler.resource_collection.class%">
2525
<tag name="jms_serializer.subscribing_handler"/>
2626
</service>
2727

28-
<service id="cmf_resource_rest.serializer.handler.phpcr_node" class="%cmf_resource_rest.serializer.handler.phpcr_node.class%">
28+
<service id="cmf_resource_rest.serializer.jms.handler.phpcr_node" class="%cmf_resource_rest.serializer.jms.handler.phpcr_node.class%">
2929
<tag name="jms_serializer.subscribing_handler"/>
3030
</service>
3131

32-
<service id="cmf_resource_rest.serializer.subscriber.phpcr_node" class="%cmf_resource_rest.serializer.subscriber.phpcr_node.class%">
32+
<service id="cmf_resource_rest.serializer.jms.subscriber.phpcr_node" class="%cmf_resource_rest.serializer.jms.subscriber.phpcr_node.class%">
3333
<tag name="jms_serializer.event_subscriber" />
3434
</service>
3535

36-
<service id="cmf_resource_rest.serializer.subscriber.resource" class="%cmf_resource_rest.serializer.subscriber.resource.class%">
36+
<service id="cmf_resource_rest.serializer.jms.subscriber.resource" class="%cmf_resource_rest.serializer.jms.subscriber.resource.class%">
3737
<tag name="jms_serializer.event_subscriber" />
3838
</service>
3939

40-
<service id="cmf_resource_rest.serializer.subscriber.resource_collection" class="%cmf_resource_rest.serializer.subscriber.resource_collection.class%">
40+
<service id="cmf_resource_rest.serializer.jms.subscriber.resource_collection" class="%cmf_resource_rest.serializer.jms.subscriber.resource_collection.class%">
4141
<tag name="jms_serializer.event_subscriber" />
4242
</service>
43+
44+
<service id="cmf_resource_rest.serializer.jms.subscriber.resource_collection" class="%cmf_resource_rest.serializer.jms.subscriber.resource_collection.class%">
45+
<tag name="jms_serializer.event_subscriber" />
46+
</service>
47+
4348
</services>
4449
</container>

Serializer/EventSubscriber/PhpcrNodeSubscriber.php renamed to Serializer/Jms/EventSubscriber/PhpcrNodeSubscriber.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
* file that was distributed with this source code.
1010
*/
1111

12-
namespace Symfony\Cmf\Bundle\ResourceRestBundle\Serializer\EventSubscriber;
12+
namespace Symfony\Cmf\Bundle\ResourceRestBundle\Serializer\Jms\EventSubscriber;
1313

1414
use JMS\Serializer\EventDispatcher\EventSubscriberInterface;
1515
use PHPCR\NodeInterface;

Serializer/EventSubscriber/ResourceCollectionSubscriber.php renamed to Serializer/Jms/EventSubscriber/ResourceCollectionSubscriber.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
* file that was distributed with this source code.
1010
*/
1111

12-
namespace Symfony\Cmf\Bundle\ResourceRestBundle\Serializer\EventSubscriber;
12+
namespace Symfony\Cmf\Bundle\ResourceRestBundle\Serializer\Jms\EventSubscriber;
1313

1414
use JMS\Serializer\EventDispatcher\EventSubscriberInterface;
1515
use PHPCR\NodeInterface;

Serializer/EventSubscriber/ResourceSubscriber.php renamed to Serializer/Jms/EventSubscriber/ResourceSubscriber.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
* file that was distributed with this source code.
1010
*/
1111

12-
namespace Symfony\Cmf\Bundle\ResourceRestBundle\Serializer\EventSubscriber;
12+
namespace Symfony\Cmf\Bundle\ResourceRestBundle\Serializer\Jms\EventSubscriber;
1313

1414
use JMS\Serializer\EventDispatcher\EventSubscriberInterface;
1515
use PHPCR\NodeInterface;
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony CMF package.
5+
*
6+
* (c) 2011-2014 Symfony CMF
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Cmf\Bundle\ResourceRestBundle\Serializer\Jms\Exclusion;
13+
14+
use JMS\Serializer\Exclusion\ExclusionStrategyInterface;
15+
use JMS\Serializer\Metadata\ClassMetadata;
16+
use JMS\Serializer\Context;
17+
use JMS\Serializer\Metadata\PropertyMetadata;
18+
19+
class GlobalDepthExclusionStrategy implements ExclusionStrategyInterface
20+
{
21+
private $globalMaxDepth;
22+
23+
/**
24+
* @param integer $globalMaxDepth
25+
*/
26+
public function __construct($globalMaxDepth = null)
27+
{
28+
$this->globalMaxDepth = $globalMaxDepth;
29+
}
30+
31+
/**
32+
* {@inheritDoc}
33+
*/
34+
public function shouldSkipClass(ClassMetadata $metadata, Context $context)
35+
{
36+
return $this->isTooDeep($context);
37+
}
38+
39+
/**
40+
* {@inheritDoc}
41+
*/
42+
public function shouldSkipProperty(PropertyMetadata $property, Context $context)
43+
{
44+
return $this->isTooDeep($context);
45+
}
46+
47+
private function isTooDeep(Context $context)
48+
{
49+
$depth = $context->getDepth();
50+
$metadataStack = $context->getMetadataStack();
51+
52+
$nthProperty = 0;
53+
// iterate from the first added items to the lasts
54+
for ($i = $metadataStack->count() - 1; $i > 0; $i--) {
55+
$metadata = $metadataStack[$i];
56+
if ($metadata instanceof PropertyMetadata) {
57+
$nthProperty++;
58+
$relativeDepth = $depth - $nthProperty;
59+
60+
if (null !== $metadata->maxDepth && $relativeDepth > $metadata->maxDepth) {
61+
return true;
62+
}
63+
64+
if (null !== $this->globalMaxDepth && $relativeDepth > $this->globalMaxDepth) {
65+
return true;
66+
}
67+
}
68+
}
69+
70+
return false;
71+
}
72+
}

Serializer/Handler/PhpcrNodeHandler.php renamed to Serializer/Jms/Handler/PhpcrNodeHandler.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
* file that was distributed with this source code.
1010
*/
1111

12-
namespace Symfony\Cmf\Bundle\ResourceRestBundle\Serializer\Handler;
12+
namespace Symfony\Cmf\Bundle\ResourceRestBundle\Serializer\Jms\Handler;
1313

1414
use JMS\Serializer\Handler\SubscribingHandlerInterface;
1515
use JMS\Serializer\GraphNavigator;

Serializer/Handler/ResourceCollectionHandler.php renamed to Serializer/Jms/Handler/ResourceCollectionHandler.php

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
* file that was distributed with this source code.
1010
*/
1111

12-
namespace Symfony\Cmf\Bundle\ResourceRestBundle\Serializer\Handler;
12+
namespace Symfony\Cmf\Bundle\ResourceRestBundle\Serializer\Jms\Handler;
1313

1414
use Puli\Repository\Api\ResourceCollection;
1515
use Puli\Repository\Api\Resource\Resource;
@@ -51,9 +51,7 @@ public function serializeCollection(
5151
) {
5252
$res = array();
5353
foreach ($collection as $resource) {
54-
$context->startVisiting($resource);
55-
$res[$resource->getName()] = $context->accept($resource);
56-
$context->stopVisiting($resource);
54+
$res[$resource->getName()] = $context->accept($resource, array('name' => 'Puli\Repository\Api\Resource\Resource'));
5755
}
5856

5957
return $res;

Serializer/Handler/ResourceHandler.php renamed to Serializer/Jms/Handler/ResourceHandler.php

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* file that was distributed with this source code.
99
*/
1010

11-
namespace Symfony\Cmf\Bundle\ResourceRestBundle\Serializer\Handler;
11+
namespace Symfony\Cmf\Bundle\ResourceRestBundle\Serializer\Jms\Handler;
1212

1313
use JMS\Serializer\Handler\SubscribingHandlerInterface;
1414
use JMS\Serializer\GraphNavigator;
@@ -19,6 +19,7 @@
1919
use Symfony\Cmf\Component\Resource\RepositoryRegistryInterface;
2020
use Symfony\Cmf\Bundle\ResourceRestBundle\Registry\PayloadAliasRegistry;
2121
use Symfony\Cmf\Bundle\ResourceRestBundle\Registry\EnhancerRegistry;
22+
use Symfony\Cmf\Component\Resource\Repository\Resource\CmfResource;
2223

2324
/**
2425
* Handle PHPCR resource serialization
@@ -66,25 +67,40 @@ public function serializeResource(
6667
Context $context
6768
) {
6869

70+
$data = $this->doSerializeResource($resource);
71+
$context->accept($data);
72+
}
73+
74+
private function doSerializeResource(Resource $resource)
75+
{
6976
$data = array();
7077
$repositoryAlias = $this->registry->getRepositoryAlias($resource->getRepository());
7178

7279
$data['repository_alias'] = $repositoryAlias;
7380
$data['repository_type'] = $this->registry->getRepositoryType($resource->getRepository());
7481
$data['payload_alias'] = $this->payloadAliasRegistry->getPayloadAlias($resource);
75-
$data['payload_type'] = $resource->getPayloadType();
82+
83+
if ($resource instanceof CmfResource) {
84+
$data['payload_type'] = $resource->getPayloadType();
85+
}
86+
7687
$data['path'] = $resource->getPath();
7788
$data['repository_path'] = $resource->getRepositoryPath();
7889
$children = $resource->listChildren();
79-
$data['children'] = $context->accept($children);
8090

8191
$enhancers = $this->enhancerRegistry->getEnhancers($repositoryAlias);
8292

93+
$children = array();
94+
foreach ($resource->listChildren() as $name => $resource) {
95+
$children[$name] = $this->doSerializeResource($resource);
96+
}
97+
$data['children'] = $children;
98+
8399
foreach ($enhancers as $enhancer) {
84100
$data = $enhancer->enhance($data, $resource);
85101
}
86102

87-
$context->accept($data);
103+
return $data;
88104
}
89105
}
90106

0 commit comments

Comments
 (0)