Как правильно остановить выполнение кода после отправки заголовков ответа, но без использования exit()
?
Я знаю, что скрипт ДОЛЖЕН вернуть ответ, но как я могу заставить его возвращаться извне контроллера, например, из службы?
Допустим, метод моей службы возвращает ответ таким образом:
return RedirectResponse($url)->send();
Но в другом месте он может вернуть другие вещи. Так что я могу проверить, что он на самом деле возвращает:
$result = $myService->doSomething();
if ($result instanceof RedirectResponse) {
return $result;
}
Чего я хочу добиться, так это избегать проверки типа результата в каждом месте, где я использую свой сервис, НО я хотел бы видеть возвращенный ответ в Profiler / logs (если я использую exit (), я не могу).
Есть ли способ принудительно завершить ядро?
РЕДАКТИРОВАТЬ:
На самом деле служба используется в событии перед любым контроллером, поэтому я хочу сделать перенаправление перед выполнением любого контроллера. Так может быть, способ пропустить выполнение контроллера?
Контроллер — это вызываемый вами PHP, который берет информацию из HTTP-запроса, создает и возвращает HTTP-ответ (как объект Symfony Response).
Единственная задача для контроллера — обработать запрос и вернуть ответ. Наличие службы для обработки объекта Response, вероятно, является плохим выбором дизайна.
В любом случае, вы можете просто умереть / выйти из контроллера и использовать события ядра, чтобы подключить поток запросов / ответов и проверить возвращенный ответ. Вероятно, завершение события является правильным выбором http://symfony.com/doc/current/components/http_kernel/introduction.html
Хорошо, я нашел способ сделать это. Все, что мне нужно было сделать — это завершить работу ядра перед выходом — оно отправляет все события после ответа (например, профилирование, ведение журнала и т. Д.).
$response = new RedirectResponse($url);
$response->send();
$kernel->terminate($request, $response);
exit();
Если кто-то найдет лучший способ сделать это, пожалуйста, ответьте, чтобы я мог поменять оценку.