symfony 使用API平台规范化集合

5lwkijsr  于 2022-11-16  发布在  其他
关注(0)|答案(2)|浏览(170)

我设法使用@ApiFilter(SearchFilter::class)注解,通过API Platform获得了一个经过过滤的Note实体集合。
现在我想转换json响应,它是一个hydra集合
示例:

{
  "@context": "/api/contexts/Note",
  "@id": "/api/notes",
  "@type": "hydra:Collection",
  "hydra:member": []
}

到包含一个文件的归档文件并返回其元数据。
示例:

{
  "name": "my_archive.zip",
  "size": 12000,
  "nb_of_notes": 15
}

我想保留SearchFilter的优点。规范化是好方法吗?
如何在normalize()方法中访问Notes的集合/数组?

polhcujo

polhcujo1#

根据文档symfony custom_normalizer,您可以为Note实体创建一个自定义规范化器(例如NoteNormalizer)。在supportsNormalization方法中,您必须通过提供Note实体类来明确规范器只会影响Note实体。因此,在normalize方法中,您将获得Note的ArrayCollection中的每一项。如果您想确定,你可以在这个normalize方法中对$data变量(dd($data))进行转储,这样你就得到了ArrayCollection的第一个元素。这就是我试图理解它的方法。

namespace App\Serializer;

use App\Entity\Note;
use Symfony\Component\Serializer\Normalizer\ContextAwareNormalizerInterface;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;

class NoteNormalizer implements ContextAwareNormalizerInterface
{
    private $normalizer;

    public function __construct(ObjectNormalizer $normalizer) // Like in documentation you can inject here some customer service or symfony service
    {
        $this->normalizer = $normalizer;
    }

    public function normalize($topic, $format = null, array $context = [])
    {
        $data = $this->normalizer->normalize($topic, $format, $context);

        $data['name'] = 'some name';
        $data['size'] = 12000;
        $data['nb_of_notes'] = 15;

        return $data;
    }

    public function supportsNormalization($data, $format = null, array $context = [])
    {
        return $data instanceof Note;
    }
}

或者,如果需要,可以使用以下命令自动生成:

php bin/console make:serializer:normalizer

并给予名称:注意规范化程序

lnvxswe2

lnvxswe22#

只需创建一个“集合Normalizer“:

注意:对于vanilla symfony项目也是如此。

namespace App\Serializer;

use App\Entity\Note;
use Symfony\Component\Serializer\Normalizer\ContextAwareNormalizerInterface;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Normalizer\NormalizerAwareTrait;

class NoteCollectionNormalizer implements ContextAwareNormalizerInterface, NormalizerAwareInterface
{
    use NormalizerAwareTrait;

    public function supportsNormalization($data, $format = null, array $context = []): bool
    {
        if(!is_array($data) || (!current($data) instanceof Note)) {
            return false;
        }

        return true;
    }

    /**
     * @param Note[] $collection
     */
    public function normalize($collection, $format = null, array $context = [])
    {
        // ...
    }
}

相关问题