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

В FOSRestBundle: Аннотации я хочу использовать несколько @VirtualProperty с динамическими именами, потому что я получаю имена свойств из базы данных (неизвестное количество свойств)

class User
{
   private $id;
   private $name;

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

Где имя_свойства1 & имя_свойства2 .. имя_свойства3 .. и т. Д. Являются динамическими с бесконечным числом

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

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

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

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',
]

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

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

Другие вопросы по тегам