如何禁用对象属性的自动转换?

How to disable automatic casting of object properties?

我正在使用 JMS 序列化程序包对 restful api 中的数据进行序列化和反序列化。我有以下情况:

实体:

/**
 * Settings
 *
 * @ORM\Table(name="user_settings")
 * @ORM\Entity
 *
 * @JMS\ExclusionPolicy("none")
 * @JMS\AccessType("public_method")
 */
class Settings
{
    /**
     * @var boolean
     *
     * @ORM\Column(name="search", type="boolean")
     *
     * @JMS\Groups({"get", "update"})
     */
    private $search;
}

我已将 JMS 配置为使用 Doctrine 对象构造函数。

当我创建 POST 并将数据反序列化到 Settings 对象时,它可以工作,但在这样的场景中:

{"id":5, "search":"string"}

它自动将字符串 "string" 转换为布尔值。我相信这与教义有关。如果我将 ORM 列注释修改为 type="string",转换不会发生,这正是我想要的,但我想保留 type="boolean".

在目前的情况下,我无法验证对象并说 "string" 不是有效值,因为在我可以对对象进行任何验证之前它被强制转换为布尔值。

如果您需要进一步的解释,请告诉我,非常感谢您的帮助。

我找到了解决办法。

但是,我没有发现任何可能的捆绑包本身配置,但可以覆盖以下参数:

<parameter key="jms_serializer.json_deserialization_visitor.class">MyBundle\CoreBundle\Serializer\JsonDeserializationVisitor</parameter>

默认的 GenericDeserializationVisitor 使用 visitBoolean() 之类的方法,并将布尔类型转换为布尔值,这就是我的情况。