API 平台:无法将 json 数据类型与 MySQL 一起使用

API Platform: Can't get using a json data type with MySQL to work

我是 API 平台的新手,正在尝试获取 json 数据属性作为 json 对象持久保存到 MySQL。我查看了 API 平台文档并在谷歌上搜索了答案,但没有找到任何答案。

我的设置:

MySQL 列定义为:

`document` json DEFAULT NULL 

我定义了一个"MyEntity"PHP对象,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 错误请求错误

{
    "@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 Error 和一个不同的内部错误:

{
    "@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 平台无法识别 JSON 数据类型并且需要一个自定义实体...对我来说似乎不正确。

我还查看了学说的类型,据我所知,API 平台使用并找到了以下信息:

Some vendors have a native JSON type and Doctrine will use it if possible and otherwise silently fall back to the vendor’s text type to ensure the most efficient storage requirements. If the vendor does not have a native JSON type, this type requires an SQL column comment hint so that it can be reverse engineered from the database. Doctrine cannot map back this type properly on vendors not supporting column comments and will fall back to text type instead.

但是由于 MySQL 确实支持 JSON 数据类型,我认为这会起作用,但显然不行。非常感谢任何有关 API 平台如何使用 MYSQL 处理 JSON 数据类型的帮助。

您收到此错误是因为您的 PHPdoc 类型提示。 Api-平台在规范化期间使用 PHPdoc 元数据。

PHP 中没有 "json" 数据类型,因此它将在同一命名空间中查找 class。

来自学说文档:

Values retrieved from the database are always converted to PHP’s array or null types using PHP’s json_decode() function.

因此您应该将 PHP文档类型提示更改为 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;
}