2020-08-07 23:42:38 +01:00

68 lines
1.9 KiB
PHP

<?php
/*
* Copyright 2011 Johannes M. Schmitt <schmittjoh@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
namespace JMS\Serializer\Exclusion;
use JMS\Serializer\Context;
use JMS\Serializer\Metadata\ClassMetadata;
use JMS\Serializer\Metadata\PropertyMetadata;
/**
* @author Adrien Brault <adrien.brault@gmail.com>
*/
class DepthExclusionStrategy implements ExclusionStrategyInterface
{
/**
* {@inheritDoc}
*/
public function shouldSkipClass(ClassMetadata $metadata, Context $context)
{
return $this->isTooDeep($context);
}
/**
* {@inheritDoc}
*/
public function shouldSkipProperty(PropertyMetadata $property, Context $context)
{
return $this->isTooDeep($context);
}
private function isTooDeep(Context $context)
{
$depth = $context->getDepth();
$metadataStack = $context->getMetadataStack();
$nthProperty = 0;
// iterate from the first added items to the lasts
for ($i = $metadataStack->count() - 1; $i > 0; $i--) {
$metadata = $metadataStack[$i];
if ($metadata instanceof PropertyMetadata) {
$nthProperty++;
$relativeDepth = $depth - $nthProperty;
if (null !== $metadata->maxDepth && $relativeDepth > $metadata->maxDepth) {
return true;
}
}
}
return false;
}
}