1

在 FOSRestBundle : Annotations 中,我想使用多个带有动态名称的@VirtualProperty,因为我从数据库中获取属性名称(属性数量未知)

class User
{
   private $id;
   private $name;

   /**
    * @Serializer\VirtualProperty
    *
    * @return array
    */
   public function getSomeMethod()
   {
       return array('property_name1'=> 'value1', 'property_name2'=>'value2');
   }
}

其中 property_name1 & property_name2 .. property_name3 .. etc 是动态的,具有无穷大的数字

我想将它们设置为虚拟属性,每个属性都有一个字符串值。

我不想将它们设置为具有一个属性的数组。

如果没有办法做到这一点,请告诉我是否可以从控制器执行相同的任务?

4

2 回答 2

1

由于 FOSRestBundle 在下面使用 JMSSerializer,并且您希望能够完全控制序列化程序返回的内容,并且输出数据强烈依赖于它接收的输入,您可以为一个特定的类编写自定义处理程序。

有关更多详细信息,请参阅:

于 2016-11-07T11:30:55.213 回答
1

原来是评论...

您可以使用@Serializer\Inline这样的方法来执行此操作,以便购买的数组的属性成为父对象的属性。

更多信息

这实质上允许您将要购买的数组或对象的公开属性或键/值作为父对象的属性。

例如..

class Id
{
    /**
     * @Expose
     */
    private $id;

    //...
}

class Parent
{
    /**
     * @Expose
     * @Inline
     */
    private $id;

    /**
     * @Expose
     * @Inline
     */
    private $name = 'parent';

    /**
     * @Expose
     * @Inline
     */
    private [
        'key' => 'value',
    ];

    public function __construct()
    {
        $this->id = new Id('an-id');
    }
}

在序列化过程中首先会转换为类似于以下的数组

[
    'id' => 'an-id',
    'name' => 'parent',
    'key' => 'value',
]
于 2016-11-07T12:10:33.147 回答