微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Symfony - Api-Platform - 子资源错误

如何解决Symfony - Api-Platform - 子资源错误

我在 Symfony5 - apiPlatform 上遇到问题,当我请求一个子资源时,我在 Json 中有一个答案,但出现错误

Symfony \ Component \ VarDumper \ Cloner \ 数据对象是不可变的

我的代码

实体\客户

<?PHP

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM; use
App\Repository\CustomerRepository; use
ApiPlatform\Core\Annotation\ApiFilter; use
Doctrine\Common\Collections\Collection; use
ApiPlatform\Core\Annotation\ApiResource; use
ApiPlatform\Core\Annotation\ApiSubresource; use
Doctrine\Common\Collections\ArrayCollection; use
Symfony\Component\Serializer\Annotation\Groups;

use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\OrderFilter; use
ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter;

/**  * @ORM\Entity(repositoryClass=CustomerRepository::class)  *
@ApiResource(  *  normalizationContext={  *     
"groups"={"customers_read"}  *  },*  collectionoperations={"GET","POST"},*  itemOperations={"GET","PUT","DELETE","PATCH"},* 
subresourceOperations={  *     
"invoices_get_subresource"={"path"="/customers/{id}/invoices"}  *  } 
* )  * @ApiFilter(SearchFilter::class,properties={"firstName":"partial","lastName","company"})  *
@ApiFilter(OrderFilter::class)  */ class Customer {
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     * @Groups({"customers_read","invoices_read"})
     */
    private $id;

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

    /**
     * @ORM\Column(type="string","invoices_read"})
     */
    private $lastName;

    /**
     * @ORM\Column(type="string","invoices_read"})
     */
    private $email;

    /**
     * @ORM\Column(type="string",length=255,nullable=true)
     * @Groups({"customers_read","invoices_read"})
     */
    private $company;

    /**
     * @ORM\OnetoMany(targetEntity=Invoice::class,mappedBy="customer")
     * @Groups({"customers_read"})
     * @ApiSubresource
     */
    private $invoices;

    /**
     * @ORM\ManyToOne(targetEntity=User::class,inversedBy="customers")
     * @ORM\JoinColumn(nullable=false)
     * @Groups({"customers_read"})
     */
    private $user;

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

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

    /**
     * @Groups({"customers_read"})
     *
     * @return float|null
     */
    public function getTotalAmount(): ?float
    {
        return array_reduce($this->invoices->toArray(),function($total,$invoice){
            return $total + $invoice->getAmount();
        },0);
    }

    /**
     * @Groups({"customers_read"})
     *
     * @return float|null
     */
    public function getUnpaidamount(): ?float
    {
        return array_reduce($this->invoices->toArray(),$invoice){
            return $total + ($invoice->getStatus() === "PAID" || $invoice->getStatus() === "CANCELLED" ? 0 : $invoice->getAmount()); 
        },0);
    }

    public function getFirstName(): ?string
    {
        return $this->firstName;
    }

    public function setFirstName(string $firstName): self
    {
        $this->firstName = $firstName;

        return $this;
    }

    public function getLastName(): ?string
    {
        return $this->lastName;
    }

    public function setLastName(string $lastName): self
    {
        $this->lastName = $lastName;

        return $this;
    }

    public function getEmail(): ?string
    {
        return $this->email;
    }

    public function setEmail(string $email): self
    {
        $this->email = $email;

        return $this;
    }

    public function getCompany(): ?string
    {
        return $this->company;
    }

    public function setCompany(?string $company): self
    {
        $this->company = $company;

        return $this;
    }

    /**
     * @return Collection|Invoice[]
     */
    public function getInvoices(): Collection
    {
        return $this->invoices;
    }

    public function addInvoice(Invoice $invoice): self
    {
        if (!$this->invoices->contains($invoice)) {
            $this->invoices[] = $invoice;
            $invoice->setCustomer($this);
        }

        return $this;
    }

    public function removeInvoice(Invoice $invoice): self
    {
        if ($this->invoices->removeElement($invoice)) {
            // set the owning side to null (unless already changed)
            if ($invoice->getCustomer() === $this) {
                $invoice->setCustomer(null);
            }
        }

        return $this;
    }

    public function getUser(): ?User
    {
        return $this->user;
    }

    public function setUser(?User $user): self
    {
        $this->user = $user;

        return $this;
    } }

实体\发票

<?PHP

namespace App\Entity;

use App\Entity\User; use Doctrine\ORM\Mapping as ORM; use
App\Repository\InvoiceRepository; use
ApiPlatform\Core\Annotation\ApiFilter; use
ApiPlatform\Core\Annotation\ApiResource; use
Symfony\Component\Serializer\Annotation\Groups; use
ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\OrderFilter;

/**  * @ORM\Entity(repositoryClass=InvoiceRepository::class)  *
@ApiResource(  *  subresourceOperations={  *     
"api_customers_invoices_get_subresource"={  *         
"normalization_context"={"groups"={"invoices_subresource"}}  *      } 
*  },* itemOperations={"GET","increment"={  *          "method"="post",*          "path"="/invoices/{id}/increment",*    
"controller"="App\Controller\InvoiceIncrementationController",*     
"openapi_context"={  *              "summary"="Incrémente une
facture",*              "description"="Incrémente le chrono d'une
facture donnée"  *          }  *  }},*  attributes={  *     
"pagination_enabled"=true,*      "pagination_items_per_page"=20,* 
"order": {"sentAt":"desc"}  *  },* 
normalizationContext={"groups"={"invoices_read"}}  * )  *
@ApiFilter(OrderFilter::class,properties={"amount","sentAt"})  */
class Invoice {
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     * @Groups({"invoices_read","customers_read","invoices_subresource"})
     */
    private $id;

    /**
     * @ORM\Column(type="float")
     * @Groups({"invoices_read","invoices_subresource"})
     */
    private $amount;

    /**
     * @ORM\Column(type="datetime")
     * @Groups({"invoices_read","invoices_subresource"})
     */
    private $sentAt;

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

    /**
     * @ORM\ManyToOne(targetEntity=Customer::class,inversedBy="invoices")
     * @ORM\JoinColumn(nullable=false)
     * @Groups({"invoices_read"})
     */
    private $customer;

    /**
     * @ORM\Column(type="integer")
     * @Groups({"invoices_read"})
     * @Groups({"invoices_read","invoices_subresource"})
     */
    private $chrono;

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

    /**
     * Permet de récupérer le User à qui appartient finalement la facture
     * @Groups({"invoices_read","invoices_subresource"})
     *
     * @return User
     */
    public function getUser(): ?User
    {
        return $this->customer->getUser();
    }

    public function getAmount(): ?float
    {
        return $this->amount;
    }

    public function setAmount(float $amount): self
    {
        $this->amount = $amount;

        return $this;
    }

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

    public function setSentAt(\DateTimeInterface $sentAt): self
    {
        $this->sentAt = $sentAt;

        return $this;
    }

    public function getStatus(): ?string
    {
        return $this->status;
    }

    public function setStatus(string $status): self
    {
        $this->status = $status;

        return $this;
    }

    public function getCustomer(): ?Customer
    {
        return $this->customer;
    }

    public function setCustomer(?Customer $customer): self
    {
        $this->customer = $customer;

        return $this;
    }

    public function getChrono(): ?int
    {
        return $this->chrono;
    }

    public function setChrono(int $chrono): self
    {
        $this->chrono = $chrono;

        return $this;
    } }

感谢您的帮助

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。