Próbuję zbudować usługę sieci Web REST, która zwraca JSON dla wszystkich połączeń. Zwykle jest to bardzo proste, po prostu zrobić tak:Jak wychwycić wszystkie wyjątki, które mogą wystąpić w działaniu kontrolera Symfony2?
return new Response(json_encode($return_object));
Moje pytanie jest, w jaki sposób należy przechwytywać wyjątków w globalnej sposób? Chcę to zrobić, ponieważ jeśli w moim zgłoszeniu wystąpi wyjątek, nadal chciałbym zwrócić klientowi wiadomość JSON mówiąc "Yo dawg, słyszałem, że lubisz wyjątki". Uważam, że zwracanie JSON zarówno w przypadkach sukcesów, jak i niepowodzeń uprości pracę, którą każdy klient musi wykonać, aby zaimplementować mój interfejs API.
Dotychczas jedyną rzeczą, którą mogę pomyśleć, to napisać każde działanie kontrolera takiego:
public function generateMemeAction($arg1, $arg2) {
$return_object = array();
try {
// stuff to generate meme here
$return_object['status'] = "GREAT SUCCESS!";
} catch (Exception $e) {
// epic fail
$return_object['status'] = "UnluckyBrianException";
}
return new Response(json_encode($return_object));
}
Jakie to wszystko wielkie i wspaniałe, ale blok try-catch będą takie same dla każdego działania w mojej aplikacji i będę się czuł głupio za każdym razem, gdy będę musiał edytować wokół kupki makaronu kopii. Pro porady?
Awesome! Dzięki Evgeny, to naprawdę oczyszcza sprawy. Trochę więcej pracowałem i znalazłem dokładnie, jak zasubskrybować funkcję do tego wydarzenia: http://symfony.com/doc/current/cookbook/service_container/event_listener.html – robertdfrench
Możesz także zastosować warunkowe formatowanie JSON, sprawdzając żądanie nagłówki i powracające wcześnie: 'if (! $ event-> getRequest() -> nagłówki-> zawiera ('Accept', 'application/json')) return;' – Tamlyn