#php #symfony #doctrine #nuxt.js #api-platform.com
Вопрос:
У меня есть ошибка, когда я пытаюсь опубликовать или провести гонку, вот мои классы и заголовок, отправленный на платформу api, скажите мне, если вам что-нибудь еще нужно
Я заблудился, пожалуйста, помогите :'(
Гонка
<?php
namespace AppEntity;
use ApiPlatformCoreAnnotationApiFilter;
use ApiPlatformCoreBridgeDoctrineOrmFilterDateFilter;
use ApiPlatformCoreApiFilterInterface;
use ApiPlatformCoreAnnotationApiResource;
use AppRepositoryRaceRepository;
use DateTimeInterface;
use DoctrineCommonCollectionsArrayCollection;
use DoctrineCommonCollectionsCollection;
use DoctrineORMMapping as ORM;
use SymfonyComponentSerializerAnnotationGroups;
use SymfonyComponentValidatorConstraints as Assert;
/**
* @ApiResource(
* attributes={
* "normalization_context"={"groups"={"read"}, "enable_max_depth"=true},
* "denormalization_context"={"groups"={"write"}}
* },
* collectionOperations={
* "get"={
* "normalization_context"={"groups"={"RaceCollection"}}
* },
* "post"={
* "denormalization_context"={"groups"={"RaceWrite"}, "enable_max_depth"=true}
* }
* },
* itemOperations={
* "get"={
* "normalization_context"={"groups"={"RaceItem"}}
* },
* "put"={
* "denormalization_context"={"groups"={"RaceWrite"}, "enable_max_depth"=true}
* },
* "delete"={
* "normalization_context"={"groups"={"RaceItemDelete"}}
* }
* }
* )
* @ORMEntity(repositoryClass=RaceRepository::class)
*/
class Race
{
const GENRES = ['F', 'H', 'M'];
/**
* @ORMId
* @ORMGeneratedValue
* @ORMColumn(type="integer")
* @Groups({"read", "write",
* "RaceCollection", "RaceWrite", "RaceItem", "RaceItemDelete",
* "ParticipantCollection", "ParticipantWrite",
* "TeamCollection", "TeamWrite", "TeamItem"
* })
*/
private $id;
/**
* @ORMColumn(type="string", length=70)
* @AssertNotBlank(message="Le nom de la course est obligatoire")
* @AssertLength(max=70, maxMessage="Le nom de la course ne doit pas dépasser 70 caractères")
* @Groups({"read", "write",
* "RaceCollection", "RaceWrite", "RaceItem",
* "ParticipantCollection", "ParticipantWrite",
* "TeamCollection", "TeamWrite", "TeamItem"
* })
*/
private $name;
/**
* @ORMColumn(type="decimal", precision=5, scale=2, nullable=true)
* @AssertNotBlank(message="La distance de la course est obligatoire")
* @AssertRange(min="0.01", max="999.99", notInRangeMessage="La distance de la course doit être entre 0.01km et 999.99km")
* @Groups({"read", "write",
* "RaceCollection", "RaceWrite", "RaceItem",
* "ParticipantCollection", "ParticipantWrite",
* "TeamCollection", "TeamWrite", "TeamItem"
* })
*/
private $distance;
/**
* @ORMColumn(type="integer", nullable=true)
* @AssertNotBlank(message="Le nombre d'équipes maximum de la course est obligatoire")
* @AssertGreaterThan(value="0", message="Au moins une équipe doit pouvoir être inscrite")
* @Groups({"read", "write",
* "RaceCollection", "RaceWrite", "RaceItem",
* "ParticipantCollection", "ParticipantWrite",
* "TeamCollection", "TeamWrite", "TeamItem"
* })
*/
private $maxTeams;
/**
* @ORMColumn(type="string", length=1)
* @AssertChoice(choices=Race::GENRES, message="La catégorie de la course doit être Mixte, Hommes ou Femmes")
* @Groups({"read", "write",
* "RaceCollection", "RaceWrite", "RaceItem",
* "ParticipantCollection", "ParticipantWrite",
* "TeamCollection", "TeamWrite", "TeamItem"
* })
*/
private $genderAllowed;
/**
* @ORMColumn(type="date", nullable=true)
* @Groups({"read", "write",
* "RaceCollection", "RaceWrite", "RaceItem",
* "ParticipantCollection", "ParticipantWrite",
* "TeamCollection", "TeamWrite", "TeamItem"
* })
*/
private $date;
/**
* @ORMColumn(type="time", nullable=true)
* @Groups({"read", "write",
* "RaceCollection", "RaceWrite", "RaceItem",
* "ParticipantCollection", "ParticipantWrite",
* "TeamCollection", "TeamWrite", "TeamItem"
* })
*/
private $time;
/**
* @ORMOneToMany(targetEntity=RaceTeam::class, mappedBy="race", orphanRemoval=true, cascade={"persist"})
* @Groups({"read", "write",
* "RaceCollection", "RaceWrite", "RaceItem",
* "ParticipantCollection", "ParticipantWrite"
* })
* @AssertCount(min=1, minMessage="Au moins une équipe doit être inscrite")
*/
private $raceTeams;
public function __construct()
{
$this->raceTeams = new ArrayCollection();
}
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;
}
public function getMaxTeams(): ?int
{
return $this->maxTeams;
}
public function setMaxTeams(?int $maxTeams): self
{
$this->maxTeams = $maxTeams;
return $this;
}
public function getGenderAllowed(): ?string
{
return $this->genderAllowed;
}
public function setGenderAllowed(string $genderAllowed): self
{
$this->genderAllowed = $genderAllowed;
return $this;
}
public function getDate(): ?DateTimeInterface
{
return $this->date;
}
public function setDate(?DateTimeInterface $date): self
{
$this->date = $date;
return $this;
}
public function getTime(): ?DateTimeInterface
{
return $this->time;
}
public function setTime(?DateTimeInterface $time): self
{
$this->time = $time;
return $this;
}
public function getDistance(): ?string
{
return $this->distance;
}
public function setDistance(?string $distance): self
{
$this->distance = $distance;
return $this;
}
/**
* @return Collection|RaceTeam[]
*/
public function getRaceTeams(): Collection
{
return $this->raceTeams;
}
public function addRaceTeam(RaceTeam $raceTeam): self
{
if (!$this->raceTeams->contains($raceTeam)) {
$this->raceTeams[] = $raceTeam;
$raceTeam->setRace($this);
}
return $this;
}
public function removeRaceTeam(RaceTeam $raceTeam): self
{
if ($this->raceTeams->removeElement($raceTeam)) {
// set the owning side to null (unless already changed)
if ($raceTeam->getRace() === $this) {
$raceTeam->setRace(null);
}
}
return $this;
}
}
Гонка
<?php
namespace AppEntity;
use ApiPlatformCoreAnnotationApiResource;
use AppRepositoryRaceTeamRepository;
use DateTime;
use DateTimeInterface;
use DoctrineORMMapping as ORM;
use SymfonyComponentSerializerAnnotationGroups;
/**
* @ApiResource(
* attributes={
* "normalization_context"={"groups"={"read"}, "enable_max_depth"=true},
* "denormalization_context"={"groups"={"write"}}
* }
* )
* @ORMEntity(repositoryClass=RaceTeamRepository::class)
*/
class RaceTeam
{
/**
* @ORMId
* @ORMGeneratedValue
* @ORMColumn(type="integer")
* @Groups({"read", "write",
* "RaceCollection", "RaceWrite", "RaceItem",
* "TeamCollection", "TeamWrite", "TeamItem"
* })
*/
private $id;
/**
* @ORMManyToOne(targetEntity=Race::class, inversedBy="raceTeams", cascade={"persist"})
* @ORMJoinColumn(nullable=false)
* @Groups({"read", "write",
* "TeamCollection", "TeamWrite", "TeamItem"
* })
*/
private $race;
/**
* @ORMManyToOne(targetEntity=Team::class, inversedBy="raceTeams", cascade={"persist"})
* @ORMJoinColumn(nullable=false)
* @Groups({"read", "write",
* "RaceCollection", "RaceWrite", "RaceItem"
* })
*/
private $team;
/**
* @ORMColumn(type="datetime", nullable=true)
* @Groups({"read", "write",
* "RaceCollection", "RaceWrite", "RaceItem",
* "TeamCollection", "TeamWrite", "TeamItem"
* })
*/
private $timeStart;
/**
* @ORMColumn(type="datetime", nullable=true)
* @Groups({"read", "write",
* "RaceCollection", "RaceWrite", "RaceItem",
* "TeamCollection", "TeamWrite", "TeamItem"
* })
*/
private $timeEnd;
/**
* @ORMColumn(type="time", nullable=true)
* @Groups({"read", "write",
* "RaceCollection", "RaceWrite", "RaceItem",
* "TeamCollection", "TeamWrite", "TeamItem"
* })
*/
private $timePenalty;
/**
* @ORMColumn(type="boolean")
* @Groups({"read", "write",
* "RaceCollection", "RaceWrite", "RaceItem",
* "TeamCollection", "TeamWrite", "TeamItem"
* })
*/
private $havePaid = false;
public function getId(): ?int
{
return $this->id;
}
public function getRace(): ?Race
{
return $this->race;
}
public function setRace(?Race $race): self
{
$this->race = $race;
return $this;
}
public function getTeam(): ?Team
{
return $this->team;
}
public function setTeam(?Team $team): self
{
$this->team = $team;
return $this;
}
public function getTimeStart(): ?DateTimeInterface
{
return $this->timeStart;
}
public function setTimeStart(?DateTimeInterface $timeStart): self
{
$this->timeStart = $timeStart;
return $this;
}
public function getTimeEnd(): ?DateTimeInterface
{
return $this->timeEnd;
}
public function setTimeEnd(?DateTimeInterface $timeEnd): self
{
$this->timeEnd = $timeEnd;
return $this;
}
public function getTimePenalty(): ?DateTimeInterface
{
return $this->timePenalty;
}
public function setTimePenalty(?DateTimeInterface $timePenalty): self
{
$this->timePenalty = $timePenalty;
return $this;
}
public function getHavePaid(): ?bool
{
return $this->havePaid;
}
public function setHavePaid(bool $havePaid): self
{
$this->havePaid = $havePaid;
return $this;
}
}
Team
<?php
namespace AppEntity;
use ApiPlatformCoreAnnotationApiResource;
use AppRepositoryTeamRepository;
use DoctrineCommonCollectionsArrayCollection;
use DoctrineCommonCollectionsCollection;
use DoctrineORMMapping as ORM;
use SymfonyBridgeDoctrineValidatorConstraintsUniqueEntity;
use SymfonyComponentSerializerAnnotationGroups;
use SymfonyComponentValidatorConstraints as Assert;
/**
* @ApiResource(
* attributes={
* "normalization_context"={"groups"={"read"}, "enable_max_depth"=true},
* "denormalization_context"={"groups"={"write"}}
* },
* collectionOperations={
* "get"={
* "normalization_context"={"groups"={"TeamCollection"}}
* },
* "post"={
* "denormalization_context"={"groups"={"TeamWrite"}}
* }
* },
* itemOperations={
* "get"={
* "normalization_context"={"groups"={"TeamItem"}}
* },
* "put"={
* "normalization_context"={"groups"={"TeamWrite"}}
* },
* "delete"={
* "normalization_context"={"groups"={"TeamDelete"}}
* }
* }
* )
* @ORMEntity(repositoryClass=TeamRepository::class)
* @UniqueEntity(fields={"name"}, message="Cette équipe existe déjà")
*/
class Team
{
const GENRES = ['F', 'H', 'M'];
/**
* @ORMId
* @ORMGeneratedValue
* @ORMColumn(type="integer")
* @Groups({"read", "write",
* "RaceCollection", "RaceWrite", "RaceItem",
* "ParticipantCollection", "ParticipantWrite", "ParticipantItem",
* "TeamCollection", "TeamWrite", "TeamItem", "TeamDelete"
* })
*/
private $id;
/**
* @ORMColumn(type="string", length=40, unique=true)
* @AssertNotBlank(message="Le nom de l'équipe est obligatoire")
* @AssertLength(max=40, maxMessage="Le nom de l'équipe ne doit pas dépasser 40 caractères")
* @Groups({"read", "write",
* "RaceCollection", "RaceItem", "RaceWrite",
* "ParticipantCollection", "ParticipantWrite", "ParticipantItem",
* "TeamCollection", "TeamWrite", "TeamItem"
* })
*/
private $name;
/**
* @ORMColumn(type="string", length=1)
* @AssertChoice(choices=Team::GENRES, message="La catégorie de l'équipe doit être Mixte, Hommes ou Femmes")
* @Groups({"read", "write",
* "RaceCollection", "RaceItem", "RaceWrite",
* "ParticipantCollection", "ParticipantWrite", "ParticipantItem",
* "TeamCollection", "TeamWrite", "TeamItem"
* })
*/
private $genderAllowed;
/**
* @ORMManyToMany(targetEntity=Participant::class, inversedBy="teams")
* @Groups({"read", "write",
* "RaceCollection", "RaceItem",
* "TeamCollection", "TeamWrite", "TeamItem"
* })
* @AssertCount(min=1, minMessage="Au moins un participant doit être dans l'équipe")
*/
private $participants;
/**
* @ORMOneToMany(targetEntity=RaceTeam::class, mappedBy="team", orphanRemoval=true)
* @Groups({"read", "write",
* "TeamCollection", "TeamWrite", "TeamItem"
* })
*/
private $raceTeams;
public function __construct()
{
$this->participants = new ArrayCollection();
$this->raceTeams = new ArrayCollection();
}
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;
}
/**
* @return Collection|Participant[]
*/
public function getParticipants(): Collection
{
return $this->participants;
}
public function addParticipant(Participant $participant): self
{
if (!$this->participants->contains($participant)) {
$this->participants[] = $participant;
}
return $this;
}
public function removeParticipant(Participant $participant): self
{
$this->participants->removeElement($participant);
return $this;
}
public function getGenderAllowed(): ?string
{
return $this->genderAllowed;
}
public function setGenderAllowed(string $genderAllowed): self
{
$this->genderAllowed = $genderAllowed;
return $this;
}
/**
* @return Collection|RaceTeam[]
*/
public function getRaceTeams(): Collection
{
return $this->raceTeams;
}
public function addRaceTeam(RaceTeam $raceTeam): self
{
if (!$this->raceTeams->contains($raceTeam)) {
$this->raceTeams[] = $raceTeam;
$raceTeam->setTeam($this);
}
return $this;
}
public function removeRaceTeam(RaceTeam $raceTeam): self
{
if ($this->raceTeams->removeElement($raceTeam)) {
// set the owning side to null (unless already changed)
if ($raceTeam->getTeam() === $this) {
$raceTeam->setTeam(null);
}
}
return $this;
}
}
Объект, отправленный :
{
"name": "testPost",
"distance": "7.5",
"maxTeams": 50,
"genderAllowed": "M",
"date": "2021-08-01",
"time": "12:15",
"raceTeams": [
{
"team": {
"@id": "/api/teams/156",
"@type": "Team",
"id": 156,
"name": "les Frelons Formidables",
"genderAllowed": "M"
},
"timeStart": "1970-01-01 00:00:00",
"timeEnd": null,
"havePaid": false
}
]
}
И ошибка в консоли :
Я вижу AbstractObjectNormalizer, но я не вижу, откуда он взялся
errorinconsole
Ответ №1:
разве вы не видите ошибку в своей консоли? вы используете слишком много памяти для своих memory_limit
настроек.
видеть https://haydenjames.io/understanding-php-memory_limit/ или https://www.php.net/manual/en/ini.core.php
вы можете попытаться увеличить лимит, но, скорее всего, это проблема с циклической сериализацией. (для многих задействованных сущностей — сериализации/десериализации требуется много памяти, если задействовано много строк/сущностей.