Как выставить результат функции с помощью FosRestBundle?

Я разрабатываю REST API для нашей системы, используя Symfony2 с FosRestBundle. FosRestBundle — очень хороший инструмент, но у него есть одно ограничение: только свойства (priviate, protected и public) могут быть доступны API.

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

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

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

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


person David Lin    schedule 19.07.2013    source источник


Ответы (2)


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

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

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

person mohamed amr    schedule 08.03.2015

После поиска ответа я нашел решение, наряду с аннотацией @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();
}

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

person David Lin    schedule 19.07.2013
comment
Привет. Это хорошо для сериализации, но... что происходит с десериализацией? Мне нужно открыть виртуальную собственность с возможностью чтения/записи. WBR - person manuelbcd; 28.04.2016