JMS Serializer忽略了我的YML实体排除项

Jak*_*e N 7 serialization yaml symfony jmsserializerbundle

我的配置是

jms_serializer:
    metadata:
        auto_detection: true
        directories:
            NameOfBundle:
                namespace_prefix: ""
                path: "@VendorNameOfBundle/Resources/config/serializer"
Run Code Online (Sandbox Code Playgroud)

我的YML文件名为Entity.Project.ymlcontains

Vendor\NameOfBundle\Entity\Project:
    exclusion_policy: ALL
    properties:
        id:
            expose: true
Run Code Online (Sandbox Code Playgroud)

我正在从Controller中加载序列化器

$serializer = SerializerBuilder::create()
    ->configureListeners(function(EventDispatcher $dispatcher) {
        $dispatcher->addSubscriber(new ProjectSubscriber($this->container));
    })
    ->addDefaultListeners()
    ->build();
Run Code Online (Sandbox Code Playgroud)

这完全忽略了我的YML文件并公开了Project中的所有字段.我已经清除了缓存.

但是如果我在没有自定义订阅者的情况下使用它,那么排除工作就可以了

 $serializer = $this->get("jms_serializer");
Run Code Online (Sandbox Code Playgroud)

即使明确添加目录也不起作用

$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();
Run Code Online (Sandbox Code Playgroud)

关于如何定义这条路径的文档并不清楚.上面的方法没有错误,但没有拉入YML文件.以下方法错误并说该目录不存在;

$serializer = SerializerBuilder::create()
    ->configureListeners(function(EventDispatcher $dispatcher) {
        $dispatcher->addSubscriber(new ProjectSubscriber($this->container));
    })
    ->addDefaultListeners()
    ->addMetadataDir('@VendorNameOfBundle/Resources/config/serializer')
    ->build();
Run Code Online (Sandbox Code Playgroud)

如何让JMS Serializer查看我的YML文件以排除字段并使用订阅服务器?

Jak*_*e N 0

这很有帮助使用 JMSSerialize 序列化遵循 SimplifiedYamlDriver 约定的 Doctrine2 实体

如果不指定命名空间,文件名似乎需要完全不同。我从来没有想过指定一个命名空间,因为主文档中没有提到这一点。

如果没有命名空间,那么addMetaDir使用就可以,但您还需要确保您的文件名如下所示

Vendor.NameOfBundle.Entity.Project.yml
Run Code Online (Sandbox Code Playgroud)