Платформа API - POSTing / PUTing объект со связью - PullRequest
0 голосов
/ 02 ноября 2019

Я настроил сервер на основе API-платформы . Я автоматически создал несколько сущностей с помощью Symfony Maker-bundle и изменил их в соответствии со своими потребностями. Если я вызываю API с помощью POST-запроса, я получаю сообщение об ошибке Uncaught PHP Exception Symfony\Component\Serializer\Exception\NotNormalizableValueException: "Update is not allowed for this operation.". Как я понимаю, таким образом не разрешается обновлять связанные объекты. Но это не то, что я намерен. Я просто хочу установить отношения

Что я делаю не так?

Ниже приведена упрощенная версия моей проблемы. Я исключил автоматически сгенерированные геттеры / сеттеры.

Сущности:

/**
 * @ApiResource(
 *     normalizationContext={"groups"={"book"}},
 *     denormalizationContext={"groups"={"book"}}
 * )
 */
class Book
{
    /**
     * @var integer
     *
     * @Groups({"book"})
     *
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer", options={"unsigned"=true})
     */
     private $id;


    /**
     * @var string
     *
     * @Groups({"book"})
     *
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $name;

    /**
     * @var Language
     *
     * @Groups({"book"})
     *
     * @ORM\ManyToOne(targetEntity="App\Entity\Language", inversedBy="books")
     * @ORM\JoinColumn(nullable=false)
     */
    private $language;
}
/**
 * @ApiResource(normalizationContext={"groups"={"language", "book"}})
 */
class Language
{
    /**
     * @var integer
     *
     * @Groups({"language", "book"})
     *
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer", options={"unsigned"=true})
     */
    private $id;

    /**
     * @var string
     *
     * @Groups({"language", "book"})
     *
     * @ORM\Column(type="string", length=255)
     */
    private $name;

    /**
     * @var Book
     *
     * @ORM\OneToMany(targetEntity="App\Entity\Book", mappedBy="language")
     */
    private $books;
}

Если я отправлю следующий POST-запрос к API, чтобы создать Книгу с уже существует Язык

{
    'name': 'some Name',
    'language': {
        'id': 234,
        'name': "some languages name"
    }
}

API отвечает с этой ошибкой

Uncaught PHP Exception Symfony\Component\Serializer\Exception\NotNormalizableValueException: "Update is not allowed for this operation."

Ответы [ 2 ]

1 голос
/ 12 ноября 2019

Полагаю, вам не нужно

/**
 * @var Book
 *
 * @ORM\OneToMany(targetEntity="App\Entity\Book", mappedBy="language")
 */
private $books;

в вашей сущности Language, потому что это отношение ManyToOne, так что если сущность Language не имеет этого, это не будет иметь значения для работы.

Также добавьте контекст денормализации к вашей языковой сущности или просто удалите его из обеих сущностей.

0 голосов
/ 12 ноября 2019

Если я правильно понимаю, вы хотите сделать - обновить существующий язык - и передать его вновь созданной книге в той же операции API?

Это, вероятно, действительно не будет работать. Вы можете использовать две операции (обновить и назначить через IRI, например "/api/language/234"). Или вы можете создать новую книгу и язык одновременно.

В любом случае все языки должны быть предварительно созданы, а затем только выбранные для назначения в Книги - тогда не нужно менять имя во время нового действия по созданию книги? : -)

...