Встроенное множественное множественное использование Symfony иногда дает сбой, и основанная на нем API-платформа неправильно строит пути к ресурсам (по крайней мере, не так, как хотелось бы, чтобы они создавались).
Например: есть словарь английского языкаAPI, содержащий записи, и каждый ресурс записи может иметь подресурс PartOfSpeech.Фактически несколько частей речи.
/**
* @ApiResource
* @ORM\Entity
*/
class Entry {
// ...
/**
* @var PartOfSpeech[]
*
* @ORM\OneToMany(targetEntity="PartOfSpeech", mappedBy="entry")
* @ApiSubresource
*/
public $partsOfSpeech;
}
/**
* @ApiResource
* @ORM\Entity
*/
class PartOfSpeech {
// ...
/**
* @var Entry
*
* @ORM\ManyToOne(targetEntity="Entry", inversedBy="partsOfSpeech")
*/
public $entry;
}
Итак, хотя я бы хотел, чтобы путь был parts_of_speech
, API Platform будет генерировать part_of_speeches
или даже parts_of_speeches
(в случае подресурса)по очевидной причине.Я знаю, что могу заменить операцию пути на операцию: collectionOperations={"get"={"path"="/parts_of_speech/{id}"}}
.Но я считаю это немного некрасивым и неудобным.Можно ли навязать другой путь более элегантным способом?Желательно в одном месте на ресурс.А как изменить путь подресурса?
-
Уточнение:
Я почти могу решить это как:
/**
* @ApiResource(
* collectionOperations={
* "get"={"path"="/parts_of_speech"},
* "post"={"path"="/parts_of_speech"},
* },
* itemOperations={
* "get"={"path"="/parts_of_speech/{id}"},
* "delete"={"path"="/parts_of_speech/{id}"},
* "put"={"path"="/parts_of_speech/{id}"},
* "patch"={"path"="/parts_of_speech/{id}"},
* },
* )
* @ORM\Entity
*/
class PartOfSpeech
{
Это почтивыполняет работу, но: 1. Это уродливо, поэтому я спрашиваю, есть ли более короткое, более элегантное решение;2. Даже если я напишу так, я все еще не знаю, как исправить множественное число в случае подресурса.Следующее (предположение, основанное на документации) не работает:
/**
* @ApiResource(
* subresourceOperations={
* "part_of_speech_get_subresource"={"path"="/entries/{id}/parts_of_speech"},
* }
* )
* @ORM\Entity
*/
class Entry
{
и по-прежнему отображает: /entries/{id}/parts_of_speeches