Я новичок в платформе 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.
Вы получаете эту ошибку из-за подсказок типа 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;
}
Других решений пока нет …