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

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

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

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

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

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

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

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

Есть ли способ заставить ядро ​​прекратить?


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

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

2 ответа

Решение

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

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

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

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

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

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

Другие вопросы по тегам