FosRestBundle: динамические виртуальные свойства

В 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 .. и т. д. являются динамическими с бесконечным числом

Я хочу установить их как виртуальные свойства, каждое свойство имеет строковое значение.

Я не хочу устанавливать их как массив с одним свойством.

Если нет способа сделать это, пожалуйста, дайте мне знать, могу ли я выполнить ту же задачу с контроллера?


person semsem    schedule 07.11.2016    source источник
comment
Возможно, вы сможете сделать это, используя @Serializer\Inline, чтобы свойства массива купленных были свойствами родительского объекта.   -  person qooplmao    schedule 07.11.2016
comment
Спасибо, сработало как шарм! Пожалуйста, опубликуйте его в новом ответе, чтобы отметить как принятый   -  person semsem    schedule 07.11.2016


Ответы (2)


Изначально комментарий...

Возможно, вы сможете сделать это, используя @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',
]
person qooplmao    schedule 07.11.2016

Поскольку FOSRestBundle использует JMSSerializer внизу, и вы хотите иметь полный контроль над тем, что возвращает сериализатор, а выходные данные сильно зависят от входных данных, которые он получает, вы можете написать собственный обработчик для одного конкретного класса.

Для получения более подробной информации см.:

person martin    schedule 07.11.2016