Нормализация с использованием прокси в сложной структуре данных и передовой опыт - PullRequest
0 голосов
/ 15 апреля 2020

Попробуйте сделать собственный процесс нормализации структуры данных.

Мои 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...