Требования к выводу в формате JSON

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

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

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


person ton.yeung    schedule 09.03.2012    source источник
comment
Это Zend Framework, о котором вы спрашиваете?   -  person quickshiftin    schedule 09.03.2012


Ответы (2)


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

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

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

person ton.yeung    schedule 11.03.2012
comment
это должно быть действительным, но также проверьте мое продолжение вашего комментария к моему сообщению - person Tomen; 12.03.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. Это также учит вас тому, что на самом деле должен делать контроллер, потому что, если бы вы написали представление для того же действия, ему в основном потребуются те же данные.

Ваше здоровье

person Tomen    schedule 09.03.2012
comment
Должно быть, я сделал что-то не так тогда, потому что это не сработало для меня. Попробую скачать последнюю и собрать простенький контроллер. - person ton.yeung; 10.03.2012
comment
вы включили подходящие маршруты? вам нужно активировать что-то вроде Router::connect('/{:controller}/{:action}/{:id:[0-9a-f]{24}}.{:type}', array('id' =› ноль)); - person Tomen; 12.03.2012
comment
Я этого не делал, но API является частным, и я не планирую разрешать пользователям извлекать данные с помощью GET или маршрутов. Кроме того, тестовый проект тоже не требовал этого, поэтому я согласен с моим ответом. Спасибо за ответы. - person ton.yeung; 13.03.2012