Symfony2: принудительное выполнение кода остановки после отправки заголовков ответа

Как правильно остановить выполнение кода после отправки заголовков ответа, но без использования exit()?

Я знаю, что скрипт ДОЛЖЕН вернуть ответ, но как я могу заставить его возвращаться извне контроллера, например, из службы?

Допустим, метод моей службы возвращает ответ таким образом:

return RedirectResponse($url)->send();

Но в другом месте он может вернуть другие вещи. Так что я могу проверить, что он на самом деле возвращает:

$result = $myService->doSomething();
if ($result instanceof RedirectResponse) {
return $result;
}

Чего я хочу добиться, так это избегать проверки типа результата в каждом месте, где я использую свой сервис, НО я хотел бы видеть возвращенный ответ в Profiler / logs (если я использую exit (), я не могу).

Есть ли способ принудительно завершить ядро?


РЕДАКТИРОВАТЬ:

На самом деле служба используется в событии перед любым контроллером, поэтому я хочу сделать перенаправление перед выполнением любого контроллера. Так может быть, способ пропустить выполнение контроллера?

1

Решение

Контроллер — это вызываемый вами PHP, который берет информацию из HTTP-запроса, создает и возвращает HTTP-ответ (как объект Symfony Response).

Единственная задача для контроллера — обработать запрос и вернуть ответ. Наличие службы для обработки объекта Response, вероятно, является плохим выбором дизайна.

В любом случае, вы можете просто умереть / выйти из контроллера и использовать события ядра, чтобы подключить поток запросов / ответов и проверить возвращенный ответ. Вероятно, завершение события является правильным выбором http://symfony.com/doc/current/components/http_kernel/introduction.html

1

Другие решения

Хорошо, я нашел способ сделать это. Все, что мне нужно было сделать — это завершить работу ядра перед выходом — оно отправляет все события после ответа (например, профилирование, ведение журнала и т. Д.).

$response = new RedirectResponse($url);
$response->send();
$kernel->terminate($request, $response);
exit();

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

1

По вопросам рекламы [email protected]