symfony4 Листенер события Response. Как изменить Response

Чтобы внести изменения в Response уже после отработки контроллера (например, добавить / изменить HTTP заголовки, добавить cookie и т.д.), можно навесить listener на событие FilterResponseEvent.

Это событие запускается после того, как контроллер возвращает объект Response.

Если Вы хотите отловить какой-то другой момент, в Symfony существует много стандартных встроенных событий. Можно посмотреть здесь.

Пример

<?php

namespace App\EventListener;

use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;

class ResponseListener
{
    /**
     * @param FilterResponseEvent $event
     *
     * @return void
     */
    public function onKernelResponse(FilterResponseEvent $event): void
    {
        $request = $event->getRequest();
        $response = $event->getResponse();

        // Устанавливаем куку реферального кода, если в пути передан параметр 'ref'
        preg_match(
            '%^.+ref=(.+)?&*$%',
            $request->getUri(),
            $matches
        );
        
        if (!empty($matches)) {
            $cookie = new Cookie('ref', $matches[1], time() + 60 * 60 * 24 * 30 * 12, '/');
            
            $response->headers->setCookie($cookie);
        }
    }
}
  1. Объект события передаём в качестве аргумента
  2. Внутри метода реализуем логику (в данном случае устанавливаем куки)
  3. Также следует зарегистрировать листенер в services.yaml (см.ниже)
App\EventListener\ResponseListener:
        tags:
          - { name: kernel.event_listener, event: kernel.response }

Источники