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 внизу, и вы хотите иметь полный контроль над тем, что возвращает сериализатор, и выходные данные сильно зависят от входных данных, которые он получает, вы можете написать собственный обработчик для одного конкретного класса.
Для более подробной информации смотрите: