2013-07-19 6 views
3

Я разрабатываю API REST для нашей системы, используя Symfony2 с FosRestBundle. FosRestBundle - очень хороший инструмент, но, похоже, имеет одно ограничение: к API могут быть доступны только свойства (конфиденциальные, защищенные и общедоступные).Как вывести результат функции с помощью FosRestBundle?

Я хотел бы выставить производное свойство, рассчитанное на основе двух других полей (например, full name = firstName + lastName), а также свойства, которые описывают отношения (например, название категории продукта, а не идентификатор категории a)

Однако аннотация @Expose может работать только с свойствами.

Я попытался создать свойство фиктивного объекта, установить это свойство в конструкторе (работает при создании нового) и в обработчике событий postcload жизненного цикла Doctrine (работает при загрузке из базы данных), и он работает. Но мне не нравится этот подход, поскольку он создает накладные расходы и дополнительное кодирование, даже если класс Entity не используется API.

Интересно, есть ли лучший способ достичь этого.

ответ

1

Осмотрев для ответа, я нашел решение, наряду с @Expose аннотации, сериализатор JMS поставляется с другой аннотацией только для этой цели: @Accessor

/** 
* @REST\Accessor(getter="getName") 
* @REST\Expose 
*/ 
private $name; 


/** 
* Return a name of the license 
* 
* @return string 
*/ 
public function getName() 
{ 

    return $this->getProduct()->getName(); 
} 

Да, фиктивную недвижимость по-прежнему требуется, но вы можете сделать его закрытым, и это намного лучше, чем метод, который я пытался раньше. Надеюсь, это может сэкономить какое-то время.

+0

Здравствуйте. Это хорошо для сериализации, но ... что происходит с десериализацией? Мне нужно выставить виртуальную собственность со скидкой на чтение/запись. WBR – manuelbcd

3

Вы можете использовать виртуальную собственность, чтобы вернуть значение, возвращенное функцией в качестве виртуальной собственности, которые можно найти более http://jmsyst.com/libs/serializer/master/reference/annotations#virtualproperty

/** 
* 
* @VirtualProperty() 
* @SerializedName("fullName") 
*/ 
public function getName() 
{ 
    // return name; 
} 

так, когда этот объект сериализации будет возвращать объект с FULLNAME собственности которое является значением, возвращаемым функцией getName.

Смежные вопросы