Symfony序列化器问题-NotNormalizableValueException

时间:2018-10-17 18:41:37

标签: symfony serialization fosrestbundle

当我在Symfony 4.1中使用带有FOSRestBundle的序列化程序时遇到问题

我收到以下错误消息:

  

无法规范化App \ Entity \ Youp类型的对象,找不到支持的规范化器。   Symfony \ Component \ Serializer \ Exception \ NotNormalizableValueException

我不明白为什么会有这个问题,Symfony的序列化器应该有一个序列化器对象,或者我错过了什么?

见下面我的控制者和我的实体:

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\YoupRepository")
 */
class Youp
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

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

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

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }
}

<?php 

namespace App\Controller;

use Symfony\Component\HttpFoundation\Response;

use FOS\RestBundle\Controller\FOSRestController;
use FOS\RestBundle\View\View;
use FOS\RestBundle\Controller\Annotations as Rest;

use App\Entity\Youp;

class BidonController extends FOSRestController {

  /**
   * @Rest\View()
   * @Rest\Get("/youps")
   */
  public function getPharmacies() {
    $youps = $this->getDoctrine()->getRepository(Youp::class)->findAll();
    return $youps; 
  }
}

1 个答案:

答案 0 :(得分:5)

您的对象的属性为private,因此序列化程序不知道如何规范化对象或从对象中获取任何数据。您可以将属性设置为public或启用ObjectNormalizer(使用PropertyAccess组件访问私有/受保护的属性)和/或GetSetMethodNormalizer(读取类的内容)通过在您的配置中使用以下服务定义来调用“ getter”):

services:
  # [..]
  Symfony\Component\Serializer\Normalizer\ObjectNormalizer:
    class: Symfony\Component\Serializer\Normalizer\ObjectNormalizer
    public: false
    tags:
      - { name: 'serializer.normalizer' }

  Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer:
    class: Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer
    public: false
    tags:
      - { name: 'serializer.normalizer' }

之后清除缓存。可以在documentation

中找到有关序列化器组件中已包含的标准化器的更多信息。