Требования к выводу JSON - PullRequest
1 голос
/ 09 марта 2012

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

Достаточно ли просто $ this-> render (array ('json' => compact ('data'));?
Нужно ли добавлять маршрут с указанием его json?
Нужно ли также добавлять приложение медиа-типа / json?
Мне также нужно добавить макет по умолчанию default.json.php?
Мне также нужно добавить представление action.json.php?

Примечания. Я хочу, чтобы любой произвольный URL-адрес: www.mysite.com/Controller/Action всегда возвращал json.
Я бы предпочел иметь возможность указывать тип возврата ТОЛЬКО в моем действии (т. Е. Тип рендеринга).

Ответы [ 2 ]

5 голосов
/ 12 марта 2012

Таким образом, оказывается, что в операторе ничего не требуется, кроме этой строки, когда вы возвращаете данные в нижней части действия контроллера:

    return $this->render(array('json' => $data = array(), 'status'=> 200));

Следует отметить, что данные возвращаются изнабор записей действительно уродлив.Пользователи должны сначала сделать $ recordset-> to ('array').Не уверен, почему, но to ('json') в конечном итоге экранирует все кавычки, что делает строку json действительно классной.

0 голосов
/ 09 марта 2012

Возвращать JSON проще, чем вы думаете. Я недавно сделал это и был удивлен

Я просто показываю это вам, ссылаясь на разрабатываемую мной игру - https://github.com/BitAlchemists/Elenears-Erben/blob/master/app/controllers/MapsController.php

public function view()
{
    $gameId = $this->request->params['id'];
    if($gameId == null)
    {
        return new Response();
    }

    $xSize = 10;
    $ySize = 10;
    $fields = Maps::first(array('game_id' => $gameId))->fields;
    return compact('xSize', 'ySize', 'fields');
}

Итак, вы просто готовите свои данные и возвращаете их. Магия совершается классом Media. Я не знаю, нужно ли добавлять Media.php в Bootstrap.php, просто попробуйте.

Полагаю, объяснение в том, что вам не нужно предоставлять представление или что-то еще, потому что Lithium уже знает, как представить JSON. Он также научит вас тому, что на самом деле должен делать контроллер, потому что если вы напишите представление для того же действия, ему в основном потребуются те же данные.

Приветствия

...