Попытка вставить данные ManyToOne FOSRestBundle - PullRequest
1 голос
/ 16 апреля 2020

Я пытаюсь создать API REST с пакетом FOSRestBundle (SF5). У меня есть сущность "Категория ie", у которой может быть родительский элемент "Категория ie". Вот сущность:

<?php

namespace App\Entity\Main;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation\Expose;
use JMS\Serializer\Annotation\ExclusionPolicy;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ORM\Entity(repositoryClass="App\Repository\CategorieRepository")
 * @ORM\Table(name="categorie")
 * @ExclusionPolicy("all")
 */
class Categorie
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @Expose
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @var string
     * @Assert\NotBlank()
     * @Expose
     * @ORM\Column(type="string", length=255)
     */
    private $libelle;

    /**
     * @var string
     * @Assert\NotBlank()
     * @Expose
     * @ORM\Column(type="string", length=255)
     */
    private $icone;

    /**
     * @var Categorie
     * @ORM\ManyToOne(targetEntity="App\Entity\Main\Categorie", inversedBy="categories", cascade={"all"}, fetch="EAGER")
     * @ORM\JoinColumn(name="categorie_parent_id", referencedColumnName="id", nullable=true)
     */
    private $categorieParent;

    /**
     * @var ArrayCollection
     * @ORM\OneToMany(targetEntity="App\Entity\Main\Categorie", mappedBy="categorieParent")
     */
    private $categories;

    /**
     * @var ArrayCollection
     * @ORM\OneToMany(targetEntity="App\Entity\Main\Produit", mappedBy="categorie")
     */
    private $produits;

    public function __construct()
    {
        $this->produits = new ArrayCollection();
    }

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

    public function getLibelle(): ?string
    {
        return $this->libelle;
    }

    public function setLibelle(string $libelle): self
    {
        $this->libelle = $libelle;

        return $this;
    }

    public function getIcone(): ?string
    {
        return $this->icone;
    }

    public function setIcone(string $icone): self
    {
        $this->icone = $icone;

        return $this;
    }

    public function setCategorieParent(Categorie $categorieParent): self
    {
        $this->categorieParent = $categorieParent;

        return $this;
    }

    public function getCategorieParent(Categorie $categorieParent)
    {
        return $this->categorieParent;
    }
}

Вот мое действие в контроллере:

/**
     * @Rest\View(statusCode=Response::HTTP_CREATED)
     * @Rest\Post("/api/{_locale}/categorie/create", name="api_categorie_create")
     * @ParamConverter("categorie", converter="fos_rest.request_body")
     * @IsGranted("ROLE_SUPER_ADMIN")
     * @return Categorie|View
     */
    public function create(Categorie $categorie, ConstraintViolationList $violations)
    {
        if (count($violations)) {
            return $this->view($violations, Response::HTTP_BAD_REQUEST);
        }

        $em = $this->getDoctrine()->getManager('main');
        $em->persist($categorie);
        $em->flush();

        return $categorie;
    }

Когда я использую почтальон для вставки данных с этим содержанием:

{
    "libelle":"Blonde", 
    "icone":"blonde.png", 
    "categorieParent.id": 1
}

«libelle» и «icone» вставлены, но «categoryorParent» не был установлен. Я попробовал:

{
    "libelle":"Blonde", 
    "icone":"blonde.png", 
    "categorieParent": 1
}
{
    "libelle":"Blonde", 
    "icone":"blonde.png", 
    "categorieParent": {
        "id": 1
    }
}

Для каждой попытки я устанавливаю id с номером и строкой.

И ничего не работает. Спасибо за помощь :)!

1 Ответ

0 голосов
/ 16 апреля 2020

Category_Parent будет принимать только объект категории ie; клевета и icone работают, потому что они простые строки. Вы должны использовать переданное целое число для извлечения сущности, а затем сохранить значения.

...