Symfony 1 - автоматически устанавливает тип содержимого JSON для каждого запроса AJAX - PullRequest
1 голос
/ 24 июня 2011

В своем веб-приложении я всегда отвечаю JSON на вызовы AJAX.
Таким образом, я обнаружил, что делаю это во многих действиях:

if ($request->isXmlHttpRequest()) {
    $this->getResponse()->setHttpHeader('Content-type', 'application/json');
    return $this->renderText(json_encode($details));
}

Есть ли способ получить это автоматически: каждый раз, когда запрос AJAX, тип контента - JSON?

Возможно, я подумал, что мне следует использовать фильтр, но я не знаком с фильтрами и, возможно, есть лучшее решение.

Любое предложение будет приветствоваться.

Спасибо
Dan

Ответы [ 2 ]

3 голосов
/ 24 июня 2011

Как я решил это:

Создайте новый класс myActions, который начинается с sfActions. В этом классе создайте новую функцию renderJson($data):

protected function renderJson($data) {
  $this->getResponse()->setHttpHeader('Content-type', 'application/json');
  return $this->renderText(json_encode($data));
}

Теперь пусть ваш класс контроллера наследуется от myActions (вместо sfActions). А в конце вашего контроллера просто return $this->renderJson($data);.

(Я также сделал несколько шаблонов. В renderJson, если в конфигурации установлен sf_debug, и он не запрашивается через XmlHttp.)

0 голосов
/ 31 августа 2011

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

Конечно, это означает, что вам нужно будет создать отдельные файлы шаблонов для каждого выходного шаблона, что кажется бесполезным, или использовать определенный файл макета и пропустить шаблон. Так что, в конце концов, это может означать почти одно и то же (или, по крайней мере, столько же кода).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...