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