如何在api平台结果上添加额外信息

问题描述 投票:0回答:2

我正在使用 symfony 和 api 平台。

我有资源:

/**
 * @ApiResource()
 */
class Credit
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="integer")
     */
    private $value; 
}

/api/credits
的结果是:

{
    "@context": "/api/contexts/Credit",
    "@id": "/api/credits",
    "@type": "hydra:Collection",
    "hydra:member": [
        {
            "@id": "/api/credits/1",
            "@type": "Credit",
            "id": 1,
            "value": 200,
            "createdAt": "2019-03"
        },
        {
            "@id": "/api/credits/2",
            "@type": "Credit",
            "id": 2,
            "value": 200,
            "createdAt": "2019-04"
        }
    ],
    "hydra:totalItems": 2
}

我想在我的结果中添加额外的信息,例如totalValues: 400(所有结果“值”的总和)

我该怎么做

预期结果:

  {
        "@context": "/api/contexts/Credit",
        "@id": "/api/credits",
        "@type": "hydra:Collection",
        "hydra:member": [
            {
                "@id": "/api/credits/1",
                "@type": "Credit",
                "id": 1,
                "value": 200,
                "createdAt": "2019-03"
            },
            {
                "@id": "/api/credits/2",
                "@type": "Credit",
                "id": 2,
                "value": 200,
                "createdAt": "2019-04"
            }
        ],
        "hydra:totalItems": 2,
        "totalValues": 400 
    }
symfony doctrine api-platform.com
2个回答
5
投票

解决方案是像这样实现 NormalizerInterface 和 NormalizerAwareInterface :

ApiCollectionNormalizer:

namespace App\Serializer;

use Symfony\Component\Serializer\Normalizer\NormalizerAwareInterface;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;

final class ApiCollectionNormalizer implements NormalizerInterface, NormalizerAwareInterface
{
    /**
     * @var NormalizerInterface|NormalizerAwareInterface
     */
    private $decorated;

    public function __construct(NormalizerInterface $decorated)
    {
        if (!$decorated instanceof NormalizerAwareInterface) {
            throw new \InvalidArgumentException(
                sprintf('The decorated normalizer must implement the %s.', NormalizerAwareInterface::class)
            );
        }
        $this->decorated = $decorated;
    }

    /**
     * @inheritdoc
     */
    public function normalize($object, $format = null, array $context = [])
    {
        $data = $this->decorated->normalize($object, $format, $context);
        if ('collection' === $context['operation_type'] && 'get' === $context['collection_operation_name']) {
            if ($data['@id'] === '/api/credits') {
                $totalValues = 0;
                foreach ($data['hydra:member'] as $credit) {
                    $totalValues += $credit['value'];
                }
                $data['totalValues'] = $totalValues;
            }

        }
        return $data;
    }

    /**
     * @inheritdoc
     */
    public function supportsNormalization($data, $format = null)
    {
        return $this->decorated->supportsNormalization($data, $format);
    }

    /**
     * @inheritdoc
     */
    public function setNormalizer(NormalizerInterface $normalizer)
    {
        $this->decorated->setNormalizer($normalizer);
    }

}

服务.yaml:

  'App\Serializer\ApiCollectionNormalizer':
    decorates: 'api_platform.hydra.normalizer.collection'
    arguments: [ '@App\Serializer\ApiCollectionNormalizer.inner' ]

0
投票

«如果在页面上有注释计算器,那么您可以计算出物品的价值是否等于物品的价值?示例:»

{
"@context": "/api/contexts/Credit",
"@id": "/api/credits",
"@type": "hydra:Collection",
"hydra:member": [
    {
        "@id": "/api/credits/1",
        "@type": "Credit",
        "id": 1,
        "value": 200,
        "createdAt": "2019-03"
    },
    {
        "@id": "/api/credits/2",
        "@type": "Credit",
        "id": 2,
        "value": 200,
        "createdAt": "2019-04"
    }
],
"hydra:totalItems": 5,
"totalValues": 1400

}

© www.soinside.com 2019 - 2024. All rights reserved.