【问题标题】:JMS Serializer ignored my YML Entity exclusionsJMS 序列化程序忽略了我的 YML 实体排除项
【发布时间】:2015-03-16 23:04:54
【问题描述】:

我的配置是

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 文件以排除字段并同时使用订阅者?

【问题讨论】:

    标签: symfony serialization yaml jmsserializerbundle


    【解决方案1】:

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

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

    如果没有命名空间,那么addMetaDir 的用法很好,但您还需要确保您的文件名看起来像这样

    Vendor.NameOfBundle.Entity.Project.yml
    

    【讨论】:

    • 对于仍然在这个问题上苦苦挣扎的人 - 我今天遇到了这个问题,看看这个答案 -> github.com/schmittjoh/JMSSerializerBundle/issues/… 跟着脚步走,如果你有一个空路径,请在其中设置一个断点/var_dump findFileForClass() 方法中的 vendor/jms/metadata/src/Driver/FileLocator.php 然后您应该看到它调用什么来加载您的元数据。我已经相应地调整了文件名。
    【解决方案2】:

    正如我从documentation 看到的,您需要设置您的 Yaml 文件:

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

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

    更多信息请阅读手册。

    【讨论】:

    • 我也试过了,请看我修改后的问题。添加目录根本没有效果。即使它是正确的目录。我完全迷路了。
    • @JakeN hm .. 当我看到 JMS 序列化程序缓存数据并读取它时,您是否尝试过清除测试环境缓存? php app/console cache:clear -e test
    • 查看我对此的回答,文件名必须完全正确,文档不是很好并描述了原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 2020-09-29
    • 2015-12-06
    • 2019-04-20
    • 2016-07-25
    相关资源
    最近更新 更多