API平台只接受原则类型为json_array的数组,如何保存字符串?

mwkjh3gx  于 2023-10-21  发布在  其他
关注(0)|答案(1)|浏览(137)

我有一个Symfony 4.4教义类这样:

/**
 * @ApiResource(
 *     collectionOperations={
 *          "GET" = {"security"="is_granted('ROLE_ADMIN')"},
 *          "POST" = {"security_post_denormalize"="is_granted('EDIT', object)"},
 *     },
 *     itemOperations={
 *          "GET" = {"security"="is_granted('EDIT', object)"},
 *          "PUT" = {"security"="is_granted('EDIT', object)"},
 *     },
 *     normalizationContext={"groups"="my_symfony_class:read"},
 *     denormalizationContext={"groups"="my_symfony_class:write"},
 *     attributes={
 *          "pagination_items_per_page"=30,
 *     }
 * )
 * @ORM\Table(name="my_symfony_table")
 */
class MySymfonyClass
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(name="default_value", type="json_array", nullable=true)
     *             @Groups("my_symfony_class:read","my_symfony_class:write")
     */
    private $defaultValue;
}

但是当我想将一个defaultValue设置为JSON字符串“0”的对象放置到API平台端点时,API平台给出了以下错误消息:

"The type of the \"defaultValue\" attribute must be \"array\", \"string\" given."

这个错误似乎与How to save json attribute via ApiPlatform?相同,但不同的是我没有Assert为JSON(“@Assert\Json()”)。
如何解决这一问题?

wnavrhmk

wnavrhmk1#

这就是我使用的例子。根据你的教义版本,它可能不起作用。

#[ORM\Column(type: 'json', options: ["default" => '[1, 2, 3, 4, 5]'])]
private array $openDays = [1, 2, 3, 4, 5];

使用symfony和doctrine json类型;你不需要自己设置json,只要使用php数组,它会在刷新到数据库/从数据库检索时自动json_encode / json_decode。
关于你的@Assert\Json()。它不能工作,因为它验证了你的string是一个json有效的字符串。但是当使用type: 'json'类型时,你的php类型不是string而是array。他们不能一起工作。
关于你的问题,这与API平台无关,而是与教义有关。
此外,为了避免这样的问题,我建议你键入每个属性。与理解未来问题所花费的时间相比,这将花费你很少的时间。这也会帮助你更好地理解你所做的事情。在这种情况下,doctrine json类型总是与php数组类型相关。

相关问题