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

时间:2015-01-18 23:55:16

标签: symfony serialization yaml jmsserializerbundle

我的配置是

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

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

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

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

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

 $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 Serializer查看我的YML文件以排除字段并使用订阅者?

2 个答案:

答案 0 :(得分:2)

我从documentation看到你需要设置你的Yaml文件:

有必要配置这些文件所在的元数据目录:

$serializer =
    JMS\Serializer\SerializerBuilder::create()
        ->addMetadataDir($someDir)
        ->build();

有关详细信息,请参阅手册。

答案 1 :(得分:0)

这很有用Using JMSSerialize to serialize Doctrine2 Entities that follow SimplifiedYamlDriver convention

如果您没有指定命名空间,那么文件名似乎必须完全不同。我从未想过要指定命名空间,因为主文档中没有提到它。

如果没有命名空间,则addMetaDir用法没问题,但您还需要确保文件名看起来像这样

Vendor.NameOfBundle.Entity.Project.yml