FOSRESTBundle:如何在控制器级别更改序列化程序元数据目录
FOSRESTBundle: how to alter serializer metadatadirs at controller level
如何在控制器级别为 FOSRestBundle 使用的序列化程序指定元数据目录?
我无法在 config.yml
中设置它,因为在我的情况下它取决于请求的路由。
我在 JMSSerializer doc 中看到我可以使用以下代码
$serializer = JMS\Serializer\SerializerBuilder::create()
->addMetadataDir($someDir)
->build();
但是如何将它应用到已经实例化的序列化器(或如何替换它)?
恐怕这不可能。
目录在调用 build()
in SerializerBuilder.php
时设置为元数据驱动程序。
即使 you can access the metadata factory 被 Serializer
使用,它也可能对您没有帮助,因为工厂与缓存目录无关。只有驱动程序才能使用目录。
因此,您唯一的选择可能是创建 Serializer
的新实例并使用它来代替来自 DI 的实例。
编辑:创建新的 Serializer
的工作方式与您的问题相同。那么你的 DI 容器应该是 Container 的一个实例,它有方法 set()
可以让你覆盖任何注册的服务。
如何在控制器级别为 FOSRestBundle 使用的序列化程序指定元数据目录?
我无法在 config.yml
中设置它,因为在我的情况下它取决于请求的路由。
我在 JMSSerializer doc 中看到我可以使用以下代码
$serializer = JMS\Serializer\SerializerBuilder::create()
->addMetadataDir($someDir)
->build();
但是如何将它应用到已经实例化的序列化器(或如何替换它)?
恐怕这不可能。
目录在调用 build()
in SerializerBuilder.php
时设置为元数据驱动程序。
即使 you can access the metadata factory 被 Serializer
使用,它也可能对您没有帮助,因为工厂与缓存目录无关。只有驱动程序才能使用目录。
因此,您唯一的选择可能是创建 Serializer
的新实例并使用它来代替来自 DI 的实例。
编辑:创建新的 Serializer
的工作方式与您的问题相同。那么你的 DI 容器应该是 Container 的一个实例,它有方法 set()
可以让你覆盖任何注册的服务。