DunglasApiBundle - 试图让包使用命名构造函数而不是 public 构造函数

DunglasApiBundle - Trying to get the bundle to use Named Constructors rather than public constructor

我正在为新应用程序使用 Dunglas api-平台包 (https://github.com/api-platform/api-platform)。

设置和安装很顺利,GET 请求正在运行。

在尝试使用 POST 请求创建新对象时,我收到有关拥有私有构造函数的错误。我的模型都是使用私有构造函数制作的,而是使用命名构造函数。

理想情况下,我正在寻找一种方法让捆绑包调用我的命名构造函数,...或者有人告诉我我的方法是完全错误的。

Services.yml

services:
    resource.player:
        parent:    "api.resource"
        arguments: [ "Name\Space\Player" ]
        tags:      [ { name: "api.resource" } ]

玩家对象

class Player
{
    private $name;
    private function __construct()
    {
    }
    public static function withName($playerName)
    {
        $player = new Player();
        $player->name = $playerName;
        return $player;
    }
    public function getName()
    {
        return $this->name;
    }
}

按照文档中的介绍和设置,设置几乎都是开箱即用的。我已经简要浏览了工厂的东西——希望我能够使用工厂来创建对象,允许我调用我自己命名的构造函数——但这似乎并没有像我想的那样。

非常感谢任何关于使用、边界或设置的输入。

API 平台(就像大多数 Symfony 和 Doctrine 相关的库一样)不是为处理不可变对象而设计的。

我建议按照文档中的建议创建一个典型的可变实体:

class Player
{
    private $name;

    public static function setName($playerName)
    {
        $this->name = $playerName;
    }

    public function getName()
    {
        return $this->name;
    }
}

如果您真的想保留不可变模型,您需要自己实现 Symfony\Component\PropertyAccess\PropertyAccessorInterface 并使用 CompilerPass 来制作 API 使用您自己的实现的平台。您可能需要向 API 平台和 Symfony 序列化程序组件提交补丁以更新给定对象的引用,因为目前,两个序列化程序实际上更新当前对象并且不会使用您返回的新实例with 方法。

我强烈建议您切换到典型的可变实体。