Прикрепление файла cookie к представлению в Symfony2 - PullRequest
6 голосов
/ 27 октября 2011

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

У меня в контроллере есть действие, из которого я просто хочу вернуть представление с прикрепленным файлом cookie. До сих пор я видел примеры, в основном такие:

use Symfony\Compentnt\HttpFoundation\Response;

public function indexAction() {
  $response = new Response();
  $response->headers->setCookie(new Cookie('name', 'value', 0, '/');
  $response->send();
}

Проблема в том, что он отправляет ответ ... и не отображает представление. Если я установил cookie без отправки заголовков, представление будет отображено, но заголовок (cookie) не будет отправлен.

Обыскивая, я нашел метод sendHeaders() в объекте Response, так что теперь я вручную вызываю его в своем действии перед возвратом, и это, похоже, работает:

public function indexAction() {
  ...
  $response->sendHeaders();
  return array('variables' => 'values');
}

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

1 Ответ

19 голосов
/ 28 октября 2011

Я думаю, что вы находитесь на правильных строках с:

$response->headers->setCookie(new Cookie('name', 'value', 0, '/'));

Если вы пытаетесь визуализировать шаблон, посмотрите документы здесь:

Symfony2 TemplatingСлужба

Если вы посмотрите на строку:

return $this->render('AcmeArticleBundle:Article:index.html.twig');

, в основном метод рендеринга возвращает ответ (который затем возвращает контроллер), который содержит содержимое шаблона ветки,все, что вам нужно сделать, это перехватить это:

$response = $this->render('AcmeArticleBundle:Article:index.html.twig');
$response->headers->setCookie(new Cookie('name', 'value', 0, '/'));
return $response;

Я думаю, что это все равно ...

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