问题描述
我在 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 (将#修改为@)