2015-07-23 2 views
1

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

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

Допустим, метод моего сервиса действительно возвращает ответ так:

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

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

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

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

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


EDIT:

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

ответ

1

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

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

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

1

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

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

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

+0

Фактически служба используется в событии перед любым контроллером, поэтому я хочу сделать перенаправление перед любым выполнением контроллера. Я просто хотел сделать вопрос более общим. –

+0

Обновлен вопрос. –

+1

Хорошо, понял! На той же странице вы можете найти даже событие запроса. Это должно быть то, что вы ищете. http://symfony.com/doc/current/components/http_kernel/introduction.html#the-kernel-request-event –

Смежные вопросы