2016-12-07 7 views
0

Я столкнулся со следующей ситуацией:Разрешено ли вычислять свойства объекта для его представления?

У меня есть Post объект, который связан через многие-ко-многим к Comment объекта. a Post может содержать не более 2 Comment s, помеченных как «Верх».

Мне нужно открыть API, предоставляющий функцию публикации сообщений (а также подробный просмотр сообщения, но этот вариант в порядке). Проблема заключается в том, что Post может иметь огромное количество Comment с, и я не вижу себя отображение этого представления:

[{ 
    title: "Lorem ipsum", 
    .... 
    comments: [{ 
      "author": "...", 
      "comment": ".....", 
      "top": false 
     }, ... // repeat a few thousand times 
    ] 
},... 
] 

Однако, я знаю, что большинство потребителей этого API позже хочу дисплей непосредственно верхний комментарий (s), так что я имею в виду выставляя это представление:

[{ 
    title: "Lorem ipsum", 
    .... 
    topComments: [{ 
      "author": "...", 
      "comment": ".....", 
     }, .... // repeat once more if needed 
    ] 
},... 
] 

Здесь я выбираю не отображать все комментарии, которые могут быть доступны через/сообщений/ID_OF_POST/комментарии, однако я вычисляю at "runtime" a topComments свойство (которого нет в исходном объекте в коде) и отобразить комментарий s помечены как верхние

Разрешено ли вычислять с использованием бизнес-логики и выставлять свойство, которое не существует в представленном объекте? Что, если позже, я бы хотел добавить новое вычисляемое свойство numberOfComments, все равно будет все в порядке?

Заранее спасибо за ответы

+1

Да, это разрешено, оно называется «переходные» или «виртуальные» свойства. –

+0

@ См. Http: // stackoverflow.com/questions/22926254/add-custom-property-to-serialized-object –

+0

@MathieuDormeval вы можете разместить это в качестве ответа? Я был бы очень рад принять его, поскольку он отлично ответил на то, что я хочу! :) – Lucio

ответ

1

Да это разрешено, он называется «переходной» или «виртуальных» свойство.

С Symfony Framework вы можете сделать это как this.

Надеюсь, что это поможет!

1

Это позволило вычислить с помощью бизнес-логики

Конечно это.

и выставить свойство, которого нет в представленном объекте?

Я бы не возвращать различные представления но использовать другой ресурс, чтобы получить коллекцию ресурс популярных комментариев.

GET /posts/{postId}/top-comments 

будет возвращать массив комментариев в той же форме, в полном списке, но только лучшие комментарии будут включены.

Вы также можете использовать фильтр по оригинальной коллекции:

GET /posts/{postId}/comments?top=true 
+0

Но поскольку массив верхних комментариев довольно мал (максимум 2 объекта), могу ли я включить его непосредственно в представление списка сообщений? – Lucio

+1

Конечно, почему бы и нет? –