Попробуйте сделать собственный процесс нормализации структуры данных.
Мои Normalizer
классы, работающие находки. Я добавляю ключ CHILDREN_DEPTH
внутри параметра $context
, чтобы справиться с ошибкой циклической ссылки diaboli c ... Все, кажется, качается.
Я хочу сериализовать объект, извлеченный из простого $parent->getChild()
вызов метода, ChildNormalizer::supportsNormalization()
возврат метода false
(logi c, потому что ProxyChild !instanceof Child
).
Если я добавлю [ChildClass::class, '__initializer__', '__cloner__', '__isInitialized__']
в $context[AbstractNormalizer::ATTRIBUTES]
, у меня будет хорошо отформатированный возврат, но Я не уверен, что это правильный путь.
Есть ли более эффективный способ использования Symfony процесса нормализации с прокси?
OrganizationNormalizer
class:
class OperationNormalizer extends AppNormalizer implements ContextAwareNormalizerInterface, NormalizerAwareInterface, CacheableSupportsMethodInterface
{
use Proxies\__CG__\App\Entity\Accounting\Operation as OperationProxy;
use NormalizerAwareTrait;
private const ALREADY_CALLED = 'OPERATION_NORMALIZER_ALREADY_CALLED';
private const CHILDREN = [
'breakdowns',
'entryGroups',
'payments',
'account',
'organization'
];
public function normalize($operation, string $format = null, array $context = [])
{
$context[self::ALREADY_CALLED] = true;
if (isset($context[self::CHILDREN_DEPTH]) && isset($context[self::CHILDREN_DEPTH]) > 0) {
$context[self::CHILDREN_DEPTH]--;
return $this->normalizer->normalize($operation, $format, $context);
}
dump($context[AbstractNormalizer::IGNORED_ATTRIBUTES]);
$context[AbstractNormalizer::IGNORED_ATTRIBUTES] = self::CHILDREN;
return $this->normalizer->normalize($operation, $format, $context);
}
public function supportsNormalization($data, string $format = null, array $context = [])
{
if (isset($context[self::ALREADY_CALLED]))
return false;
return ($data instanceof Operation ? true : $data instanceof OperationProxy);
}
public function hasCacheableSupportsMethod(): bool
{
return false;
}