JMS Serializer 不加载 Symfony 4 中的元数据配置

JMS Serializer does not load metadata config in Symfony 4

我已经像这样配置了 JMS 序列化程序:

jms_serializer:
    visitors:
        xml_serialization:
            format_output: '%kernel.debug%'
    metadata:
        auto_detection: true
        directories:
            App:
                namespace_prefix: "App\Entity"
                path: "%kernel.root_dir%/serializer"

这是实体 SystemUser 的 src/serializer/SystemUser.yml 中元数据配置的样子:

App\Entity\Api\Auth\SystemUser:
    exclusion_policy: ALL
    properties:
        id:
            expose: true
        password:
            expose: false
        username:
            expose: true
        email:
            expose: true
        last_login:
            expose: true

我特地使用了.yml扩展名,因为文档中提到这里必须使用.yml扩展名:

https://jmsyst.com/bundles/JMSSerializerBundle/2.x/configuration#defining-metadata

我在 src/Entity/Api/Auth/SystemUser.php 中有实体,如下所示:

<?php

namespace App\Entity\Api\Auth;

use Doctrine\ORM\Mapping as ORM;
use FOS\UserBundle\Model\User as BaseUser;

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 */
class SystemUser extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    public function __construct()
    {
        parent::__construct();
        // your own logic
    }
}

但是无论 属性 我在 SystemUser.yml 文件中排除什么,输出都不会改变。它显示所有属性。

我正在使用最新的 Symfony 4.3

您的文件 src/serializer/SystemUser.yml 的名称有误。对于 namespace_prefix: "App\Entity" 和您的 SystemUser.php 命名空间,它应该是 Api.Auth.SystemUser.yml

这是因为您的用户扩展了 BaseUser。你需要这样做:

jms_serializer.yaml

jms_serializer:
    metadata:
        auto_detection: true
        directories:
            App:
                namespace_prefix: 'App\Entity'
                path: '%kernel.root_dir%/serializer'
            FOSUB:
                namespace_prefix: 'FOS\UserBundle'
                path: '%kernel.root_dir%/serializer'

src/serializer/Model.User.yml

FOS\UserBundle\Model\User:
    exclusion_policy: ALL
    properties:
        id:
            exclude: false
        username:
            exclude: false