0

我正在将 Dunglas api-platform 捆绑包 ( https://github.com/api-platform/api-platform ) 用于新应用程序。

设置和安装很顺利,GET 请求正在工作。

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

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

服务.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;
    }
}

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

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

4

1 回答 1

1

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方法返回的新实例。

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

于 2016-01-13T17:00:51.440 回答