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
方法。
我强烈建议您切换到典型的可变实体。
我正在为新应用程序使用 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
方法。
我强烈建议您切换到典型的可变实体。