Drupal 8 устанавливает cookie при каждой загрузке страницы с помощью подписчика событий

#php #cookies #drupal-8

#php #файлы cookie #drupal-8

Вопрос:

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

Объект $event имеет свойство response, но оно всегда равно null. Поэтому я не могу установить какие-либо cookie.

  class LanguageCookieSubscriber implements EventSubscriberInterface 
 {

    protected $event;

    protected $cookieValue;

    public function init(GetResponseEvent $event) {

      $this->event = $event;

      $cookie = new Cookie("client_language_cookie", $this->cookieValue, 0, '/', NULL, FALSE);

      $this->event->getResponse()->headers->setCookie($cookie);
   }
 }
  

Я также попытался установить объект ответа. Затем я могу установить cookie, но страница будет пустой.

   $response = new Response();
  $this->event->setResponse($response);
  $cookie = new Cookie("client_language_cookie", $this->cookieValue, 0, '/', NULL, FALSE);
  $this->event->getResponse()->headers->setCookie($cookie);
  

Есть идеи, как я могу это решить? Мне нужно отобразить страницу, запрошенную пользователем, и установить только cookie.

Заранее спасибо.

Комментарии:

1. У меня сейчас такая же проблема, я все еще работаю над ней. Но, вероятно, вы подписываетесь на kernel.request событие? В kernel.request пока нет объекта ответа, возможно, попробуйте подписаться на kernel.response

Ответ №1:

Пример:

   public function onKernelResponse(ResponseEvent $event) {
    $response = $event->getResponse();

     $cookie = new Cookie('cookie name', 'my_cookie value', time()   60 * 60 * 24 * 7);
     $response->headers->setCookie($cookie);
     $event->setResponse($response);
  }