Платформа API: невозможно использовать тип данных json с MySQL для работы

Я новичок в платформе API и пытаюсь получить атрибут данных json для сохранения в MySQL как объект json. Я просмотрел документацию по платформе API и нашел ответ, но ничего не нашел.

Моя настройка:

MySQL столбец определяется как:

`document` json DEFAULT NULL

Я определил объект PHP «MyEntity», а атрибут json описывается следующим образом:

/**
* @var json
*
* @ORM\Column(type="json")
*/
private $document;

/**
* Get document.
*
* @return json
*/
public function getDocument()
{
return $this->document;
}

/**
* Set document.
*
* @param json $document
*
* @return MyEntity
*/
public function setDocument($document)
{
$this->document = $document;

return $this;
}

Теперь, когда перейдем по тому URL, который показывает интерфейс по умолчанию для MyEntity, и запустим POST, чтобы создать его с помощью этого json-ld (упрощение, чтобы пропустить другие столбцы):

{
"document": "{"test": "value"}"}

Я получаю ошибку 400 Bad Request

{
"@context": "/contexts/Error",
"@type": "hydra:Error",
"hydra:title": "An error occurred",
"hydra:description": "Syntax error",
"trace": [
{
"namespace": "",
"short_class": "",
"class": "",
"type": "",
"function": "",
"file": "/Library/WebServer/Documents/test/vendor/symfony/symfony/src/Symfony/Component/Serializer/Encoder/JsonDecode.php",
"line": 78,
"args": []
},
...

Я избежал двойных кавычек (мне кажется странным, что вам нужно это сделать, поскольку сам json описывает другой объект json) следующим образом:

{
"document": "{\"test\": \"value\"}"}

и выполните POST снова:

Я получаю ошибку 400 Bad Request с другой внутренней ошибкой:

{
"@context": "/contexts/Error",
"@type": "hydra:Error",
"hydra:title": "An error occurred",
"hydra:description": "Could not denormalize object of type AppBundle\\Entity\\json, no supporting normalizer found.",
"trace": [
{
"namespace": "",
"short_class": "",
"class": "",
"type": "",
"function": "",
"file": "/Library/WebServer/Documents/test/vendor/symfony/symfony/src/Symfony/Component/Serializer/Serializer.php",
"line": 295,
"args": []
},
...

Таким образом, похоже, что API Platform не распознает тип данных JSON и ожидает для него пользовательскую сущность … мне это не кажется правильным.

Я также рассмотрел типы для доктрины, которые, как я понимаю, API Platform использует и нашел эту информацию:

Некоторые поставщики имеют собственный тип JSON, и Doctrine будет использовать его, если
возможно и в противном случае молча отступить к типу текста поставщика к
обеспечить наиболее эффективные требования к хранению. Если продавец не
иметь собственный тип JSON, для этого типа требуется подсказка для комментария к столбцу SQL
так что он может быть обратным инжинирингом из базы данных. доктрина
не может правильно отобразить этот тип для поставщиков, не поддерживающих столбец
комментарии и будут возвращаться к типу текста вместо.

Но поскольку MySQL поддерживает тип данных JSON, я подумал, что это просто сработает, но, очевидно, нет. Будем весьма благодарны за любую помощь в том, как API Platform работает с типом данных JSON с использованием MYSQL.

0

Решение

Вы получаете эту ошибку из-за подсказок типа PHPdoc. Api-платформа использует метаданные PHPdoc при нормализации.

В PHP нет таких вещей, как тип данных «json», поэтому он будет искать класс в том же пространстве имен.

Из документации доктрины:

Значения, извлеченные из базы данных, всегда преобразуются в массив PHP или нулевые типы с помощью функции PHP json_decode ().

Таким образом, вы должны изменить свою подсказку PHPDoc на array

/**
* @var array
*
* @ORM\Column(type="json")
*/
private $document;

/**
* Get document.
*
* @return array
*/
public function getDocument()
{
return $this->document;
}

/**
* Set document.
*
* @param array $document
*
* @return MyEntity
*/
public function setDocument($document)
{
$this->document = $document;

return $this;
}
0

Другие решения

Других решений пока нет …