Ситуация следующая. Допустим, есть роут
/blog/:id, который ведёт на метод контроллера:
public function show($id)
{
return Blog::find($id);
}
Метод контроллера вызывает метод find у модели Blog и в случае успеха возвращает объект этой блогозаписи, далее данные автоматом сериализуются в json вида:
{
"id": 1,
"title": "Тестовая запись",
"content": "****** *****",
"original_content": "***"
и т.д.
}
Так вот, вопрос в следующем - требуется механизм, который бы позволял отсекать лишние данные и добавлять требуемые, например:
public function show($id)
{
return (new JsonData(Blog::find($id)))
->with(['id', 'title', 'content', 'user.login', 'user.avatar', 'user.id']);
}
Что было бы аналогично (привожу пример не учитывая того, что find может вернуть null):
public function show($id)
{
$blog = Blog::find($id);
return [
'id' => $blog->id,
'title' => $blog->title,
'content' => $blog->content,
'user' => [
'id' => $blog->user->id,
'avatar' => $blog->user->avatar,
'login' => $blog->user->login
]
];
}
Для рубей есть отличный гем, называется Rabl, который позволяет делать именно то, что надо:
attributes :id, :title, :description, :start, :end, :location
child :creator => :creator do
extends 'users/base'
end
## JSON output:
# {
# "event": {
# "id": 7,
# "title": "Et earum sed fuga.",
# "description": "Quis sed ..e ad.",
# "start": "2011-05-31T08:31:45Z",
# "end": "2011-06-01T08:31:45Z",
# "location": "Saul Tunnel",
# "creator": {
# "id": 1,
# "username": "alanna",
# "email": "rubie@hayes.name",
# "display_name": "Mrs. Gaylord Hoeger"
# }
# }
# }
Может, кто сталкивался с подобным? Что-нибудь посоветуете?