JMS 序列化程序忽略了我的 YML 实体排除项
JMS Serializer ignored my YML Entity exclusions
我的配置是
jms_serializer:
metadata:
auto_detection: true
directories:
NameOfBundle:
namespace_prefix: ""
path: "@VendorNameOfBundle/Resources/config/serializer"
我名为 Entity.Project.yml
的 YML 文件包含
Vendor\NameOfBundle\Entity\Project:
exclusion_policy: ALL
properties:
id:
expose: true
我正在从控制器中像这样加载序列化器
$serializer = SerializerBuilder::create()
->configureListeners(function(EventDispatcher $dispatcher) {
$dispatcher->addSubscriber(new ProjectSubscriber($this->container));
})
->addDefaultListeners()
->build();
这完全忽略了我的 YML 文件并公开了项目中的所有字段。我已经清除了缓存。
但是如果我在没有自定义订阅者的情况下使用它,那么排除项就会起作用
$serializer = $this->get("jms_serializer");
即使显式添加目录也不起作用
$serializer = SerializerBuilder::create()
->configureListeners(function(EventDispatcher $dispatcher) {
$dispatcher->addSubscriber(new ProjectSubscriber($this->container));
})
->addDefaultListeners()
->addMetadataDir(realpath($this->get('kernel')->getRootDir()."/../") . '/src/Vendor/NameOfBundle/Resources/config/serializer')
->build();
文档并不清楚应该如何定义这条路径。上面的方法没有报错,但是没有拉入yml文件。下面的方法出错,说目录不存在;
$serializer = SerializerBuilder::create()
->configureListeners(function(EventDispatcher $dispatcher) {
$dispatcher->addSubscriber(new ProjectSubscriber($this->container));
})
->addDefaultListeners()
->addMetadataDir('@VendorNameOfBundle/Resources/config/serializer')
->build();
如何让 JMS 序列化程序查看我的 YML 文件以排除字段并使用订阅者?
正如我从 documentation 看到的,您需要设置 Yaml 文件:
需要配置这些文件所在的元数据目录:
$serializer =
JMS\Serializer\SerializerBuilder::create()
->addMetadataDir($someDir)
->build();
有关详细信息,请阅读手册。
这很有帮助Using JMSSerialize to serialize Doctrine2 Entities that follow SimplifiedYamlDriver convention
如果不指定命名空间,文件名似乎需要完全不同。我从没想过要指定一个命名空间,因为这在主要文档中没有提到。
如果没有命名空间,那么 addMetaDir
用法没问题,但您还需要确保您的文件名看起来像这样
Vendor.NameOfBundle.Entity.Project.yml
我的配置是
jms_serializer:
metadata:
auto_detection: true
directories:
NameOfBundle:
namespace_prefix: ""
path: "@VendorNameOfBundle/Resources/config/serializer"
我名为 Entity.Project.yml
的 YML 文件包含
Vendor\NameOfBundle\Entity\Project:
exclusion_policy: ALL
properties:
id:
expose: true
我正在从控制器中像这样加载序列化器
$serializer = SerializerBuilder::create()
->configureListeners(function(EventDispatcher $dispatcher) {
$dispatcher->addSubscriber(new ProjectSubscriber($this->container));
})
->addDefaultListeners()
->build();
这完全忽略了我的 YML 文件并公开了项目中的所有字段。我已经清除了缓存。
但是如果我在没有自定义订阅者的情况下使用它,那么排除项就会起作用
$serializer = $this->get("jms_serializer");
即使显式添加目录也不起作用
$serializer = SerializerBuilder::create()
->configureListeners(function(EventDispatcher $dispatcher) {
$dispatcher->addSubscriber(new ProjectSubscriber($this->container));
})
->addDefaultListeners()
->addMetadataDir(realpath($this->get('kernel')->getRootDir()."/../") . '/src/Vendor/NameOfBundle/Resources/config/serializer')
->build();
文档并不清楚应该如何定义这条路径。上面的方法没有报错,但是没有拉入yml文件。下面的方法出错,说目录不存在;
$serializer = SerializerBuilder::create()
->configureListeners(function(EventDispatcher $dispatcher) {
$dispatcher->addSubscriber(new ProjectSubscriber($this->container));
})
->addDefaultListeners()
->addMetadataDir('@VendorNameOfBundle/Resources/config/serializer')
->build();
如何让 JMS 序列化程序查看我的 YML 文件以排除字段并使用订阅者?
正如我从 documentation 看到的,您需要设置 Yaml 文件:
需要配置这些文件所在的元数据目录:
$serializer =
JMS\Serializer\SerializerBuilder::create()
->addMetadataDir($someDir)
->build();
有关详细信息,请阅读手册。
这很有帮助Using JMSSerialize to serialize Doctrine2 Entities that follow SimplifiedYamlDriver convention
如果不指定命名空间,文件名似乎需要完全不同。我从没想过要指定一个命名空间,因为这在主要文档中没有提到。
如果没有命名空间,那么 addMetaDir
用法没问题,但您还需要确保您的文件名看起来像这样
Vendor.NameOfBundle.Entity.Project.yml