Как сопоставить запрос PUT/POST с атрибутом Symfonys #[MapRequestPayload] во вложенный DTOPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Как сопоставить запрос PUT/POST с атрибутом Symfonys #[MapRequestPayload] во вложенный DTO

Сообщение Anonymous »

Сейчас я экспериментирую с атрибутом #[MapRequestPayload] Symfony. Раньше я использовал его для плоских DTO, работал как шарм. Теперь я пытаюсь сопоставить вложенный DTO. Мой SearchResult DTO имеет одно свойство $details, которое содержит коллекцию подробных DTO. Вот два DTO:

Код: Выделить всё

class SearchResult
{
/**
* @var Collection
*/
private Collection $details;

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

public function getDetails(): Collection
{
return $this->details;
}

public function setDetails(Collection $details): SearchResult
{
$this->details = $details;
return $this;
}

public function addDetails(Details $details): self
{
if (!$this->details->contains($details)) {
$this->details[] = $details;
}
return $this;
}
}

Код: Выделить всё

class Details
{
private string $name;
private string $ticker;
private ?string $homepageUrl = null;
private ?string $description = null;
private ?string $currency = null;
private ?int $sicCode = null;
private ?string $sicDescription = null;

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

public function setName(string $name): Details
{
$this->name = $name;
return $this;
}

public function getTicker(): ?string
{
return $this->ticker;
}

public function setTicker(string $ticker): Details
{
$this->ticker = $ticker;
return $this;
}

public function getHomepageUrl(): ?string
{
return $this->homepageUrl;
}

public function setHomepageUrl(?string $homepageUrl): Details
{
$this->homepageUrl = $homepageUrl;
return $this;
}

public function getDescription(): ?string
{
return $this->description;
}

public function setDescription(?string $description): Details
{
$this->description = $description;
return $this;
}

public function getCurrency(): ?string
{
return $this->currency;
}

public function setCurrency(?string $currency): Details
{
$this->currency = $currency;
return $this;
}

public function getSicCode(): ?int
{
return $this->sicCode;
}

public function setSicCode(?int $sicCode): Details
{
$this->sicCode = $sicCode;
return $this;
}

public function getSicDescription(): ?string
{
return $this->sicDescription;
}

public function setSicDescription(?string $sicDescription): Details
{
$this->sicDescription = $sicDescription;
return $this;
}
}

Это действие контроллера:

Код: Выделить всё

#[Route('/handle', name: 'handle', methods: ['POST'])]
public function handle(#[MapRequestPayload] SearchResult $searchResult): JsonResponse
{
// Do something here
return new JsonResponse();
}
И, наконец, полезная нагрузка, которая выполнила указанное выше действие:

Код: Выделить всё

{
"details": [
{
"name": "Apple Inc",
"ticker": "AAPL",
"homepage_url": null,
"description": null,
"currency": null,
"sic_code": null,
"sic_description": null
},
{
"name": "Tesla Inc",
"ticker": "TSLA",
"homepage_url": null,
"description": null,
"currency": null,
"sic_code": null,
"sic_description": null
}
]
}
В ответ я вижу ошибку 422 в моем профилировщике Symfony. Соответствующее исключение ValidationFailedException гласит: «Подробности: это значение должно быть неизвестного типа». Я упускаю здесь что-то очень очевидное? Я думаю, что DTO правильно реплицируют запрос и поэтому должны быть заполнены данными. Кроме того, значения NULL в полезных данных должны подойти, поскольку установщики также принимают NULL.
Заранее спасибо!

Подробнее здесь: https://stackoverflow.com/questions/788 ... te-to-nest
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»