首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法从序列化数据创建XXX的实例,因为它的构造函数要求存在参数"yyy“。

无法从序列化数据创建XXX的实例,因为它的构造函数要求存在参数"yyy“。
EN

Stack Overflow用户
提问于 2022-08-01 13:25:57
回答 1查看 343关注 0票数 0

最近,我开始在我的所有代码中添加严格的类型。例如,现在我有了一个Doctrine实体,如:

代码语言:javascript
复制
<?php

namespace App\Entity;

class Post
{
    private string $title;

    private User $creator;

    public function __construct(string $title, User $creator)
    {
        $this->title = $title;
        $this->creator = $creator;
    }

    ...
}

为了演示Symfony自动化测试用例,我目前创建Post实体,而不提供JSON字符串中的用户:

代码语言:javascript
复制
$client->request(
    'POST',
    '/api/post',
    [],
    [],
    [],
    json_encode([
        'title' => 'Sample title',
    ])
);

因此,我收到一个错误,例如:

代码语言:javascript
复制
Uncaught PHP Exception Symfony\Component\Serializerception\MissingConstructorArgumentsException: "Cannot create an instance of App\Entity\Post from serialized data because its constructor requires parameter "creator" to be present." at ./vendor/api-platform/core/src/Serializer/AbstractItemNormalizer.php line 313

在我开始为User添加$creator类型之前,这是很好的。显然,$creator应该由正在使用API的当前登录用户填充。

有什么好办法解决这个问题吗?

我注意到Symfony序列化程序可以接受默认的构造函数参数:https://symfony.com/doc/current/components/serializer.html#handling-constructor-arguments

有什么办法在API平台上解决这个问题吗?

EN

回答 1

Stack Overflow用户

发布于 2022-08-01 14:01:17

最好不要手动设置创建者。

你用gedmo/doctrine-extensions (github)吗?

这个扩展提供了许多有用的扩展。

其中之一是可爆

使用字符串或对象(例如,用户)更新创建、更新甚至属性上的字符串或引用字段。

这是一种自动设置创建者的干净方法。

一旦安装了gedmo/doctrine-extensions,您只需启用blameable

代码语言:javascript
复制
#stof_doctrine_extensions.yaml
stof_doctrine_extensions:
    default_locale: fr_FR
    orm:
        default:
            blameable: true

并在您的实体中使用它,包括:

代码语言:javascript
复制
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;

/**
 * Only use annotation or attribute depending on your php version
 * @Gedmo\Blameable(on="create")
 * @ORM\ManyToOne(targetEntity=User::class)
 * @ORM\JoinColumn(name="created_by", referencedColumnName="id", nullable=true)
 */
#[ORM\ManyToOne(targetEntity: User::class)]
#[ORM\JoinColumn(name: 'created_by', referencedColumnName: 'id', nullable: true)]
#[Gedmo\Blameable(on: 'create')]
protected $creator;

我建议使用扩展,但您也可以使用自己的事件,例如,使用设置$creator值的原则$creator事件侦听器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73194416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档