反序列化时的 symfony 序列化器类型转换

Bru*_*pha 4 serialization symfony deserialization

假设我有一堂课

class MyObj
{
    /** @var int */
    private $myProp;

    public function getMyProp(): int
    {
        return $this->myProp;
    }

    public function setMyProp(int $myProp): self
    {
        $this->myProp = $myProp;

        return $this;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我想反序列化以下

$body = '{"myProp": "4"}';
$myObj = $serializer->deserialize($body, MyObj::class, 'json');
Run Code Online (Sandbox Code Playgroud)

我显然收到一个错误,说类型不匹配。

类“MyObj”的“myProp”属性的类型必须是“int”(给出的“string”)之一。

我可以配置序列化程序来对这些值进行类型转换吗?

Nik*_*ken 7

ObjectNormalizer 有一个选项可以在非规范化时禁用类型强制,您可以通过上下文参数传递该选项。

# ... 
$myObj = $serializer->deserialize(
    $body,
    MyObj::class,
    'json',
    ['disable_type_enforcement' => true]
);
# ...
Run Code Online (Sandbox Code Playgroud)

由于您在 setter 中使用类型提示,php 将尝试将给定值转换为 int。