【问题标题】:How to make Symfony serialization groups work in php?如何使 Symfony 序列化组在 php 中工作?
【发布时间】:2020-08-04 06:05:40
【问题描述】:

我正在使用 Symfony 5.1 (PHP7.2),问题是实体序列化组注释不起作用。

这是我的实体:

namespace App\Entity;

use App\Repository\ArticleRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups;

/**
 * @ORM\Entity(repositoryClass=ArticleRepository::class)
 */
class Article
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     * @Groups({"user"})
     */
    private $alias;

    /**
     * @ORM\Column(type="string", length=255)
     * @Groups({"user"})
     */
    private $title;

    /**
     * @ORM\Column(type="text")
     * @Groups({"user"})
     */
    private $content;

    /**
     * @ORM\Column(type="datetime")
     */
    private $created_at;

    /**
     * @ORM\Column(type="datetime")
     */
    private $updated_at;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $image_link;

    /**
     * @ORM\Column(type="boolean")
     */
    private $appearance_status;

    /**
     * @ORM\ManyToOne(targetEntity=User::class, inversedBy="articles")
     * @ORM\JoinColumn(nullable=false)
     */
    private $author;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getAlias(): ?string
    {
        return $this->alias;
    }

    public function setAlias(string $alias): self
    {
        $this->alias = $alias;

        return $this;
    }

    public function getTitle(): ?string
    {
        return $this->title;
    }

    public function setTitle(string $title): self
    {
        $this->title = $title;

        return $this;
    }

    public function getContent(): ?string
    {
        return $this->content;
    }

    public function setContent(string $content): self
    {
        $this->content = $content;

        return $this;
    }

    public function getCreatedAt(): ?\DateTimeInterface
    {
        return $this->created_at;
    }

    public function setCreatedAt(\DateTimeInterface $created_at): self
    {
        $this->created_at = $created_at;

        return $this;
    }

    public function getUpdatedAt(): ?\DateTimeInterface
    {
        return $this->updated_at;
    }

    public function setUpdatedAt(\DateTimeInterface $updated_at): self
    {
        $this->updated_at = $updated_at;

        return $this;
    }

    public function getImageLink(): ?string
    {
        return $this->image_link;
    }

    public function setImageLink(string $image_link): self
    {
        $this->image_link = $image_link;

        return $this;
    }

    public function getAppearanceStatus(): ?bool
    {
        return $this->appearance_status;
    }

    public function setAppearanceStatus(bool $appearance_status): self
    {
        $this->appearance_status = $appearance_status;

        return $this;
    }

    public function getAuthor(): ?User
    {
        return $this->author;
    }

    public function setAuthor(?User $author): self
    {
        $this->author = $author;

        return $this;
    }
}

这是我处理实体并尝试序列化其内容的方式:

/**
 * Returns serialized list of articles
 *
 * @param Article[] $articles
 * @return string JSON string
 */
public function serializeArticles(array $articles) : string
{
    $dateCallback = function ($innerObject, $outerObject, string $attributeName, string $format = null, array $context = []) {
        return $innerObject instanceof \DateTime ? $innerObject->format(\DateTime::ISO8601) : '';
    };

    $defaultContext = [
        AbstractNormalizer::GROUPS => ['user'],
        AbstractNormalizer::CALLBACKS => [
            'createdAt' => $dateCallback,
            'updatedAt' => $dateCallback
        ],
        AbstractNormalizer::CIRCULAR_REFERENCE_HANDLER =>
            function ($articles, $format, $context)  {
                return $articles->getId();
            },
        AbstractNormalizer::IGNORED_ATTRIBUTES => [
            '__initializer__', '__isInitialized__',
            '__cloner__'
        ]
    ];
   
    $JsonEncoder = new JsonEncoder();
    $objectNormalizer =
        new ObjectNormalizer(null, null, null,
            null, null, null,
            $defaultContext)
    ;

    $serializer = new Serializer(
        [$objectNormalizer], [$JsonEncoder]
    );

    $articles = $serializer->serialize($articles, 'json');
    return $articles;
}

无论如何,序列化组不想工作。草稿看起来我没有使用序列化组。

【问题讨论】:

    标签: php symfony serialization


    【解决方案1】:

    您似乎没有将 AnnotationsReader 对象传递给 ObjectNormalizer 的第一个参数。您应该更仔细地阅读文档。

    use Doctrine\Common\Annotations\AnnotationReader;
    use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory;
    use Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader;
    
    $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader()));
    

    我认为这应该会有所帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-07
      • 2018-04-26
      • 2021-04-17
      • 1970-01-01
      • 2014-01-24
      相关资源
      最近更新 更多