SerafimArts
@SerafimArts
Senior Notepad Reader

Есть ли аналог Rabl для PHP (фильтрация сериализуемых данных)?

Ситуация следующая. Допустим, есть роут /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"
#         }
#     }
# }

Может, кто сталкивался с подобным? Что-нибудь посоветуете?
  • Вопрос задан
  • 2565 просмотров
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
JMSSerializer? Документация у него конечно стремненькая, но все что вы хотите он умеет.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы