Можно ли в Silex использовать обработчик ошибок в зависимости от того, какое исключение выдается?
Я знаю, что это возможно с помощью одного обработчика исключений и оператора switch для имени класса сгенерированного исключения, но мне кажется, что "Silex way" чище, но не работает.
Вот как я ожидал, что это сработает
<?php
// Handle access denied errors
$app->error(function (\App\Rest\Exception\AccessDenied $e) {
$message = $e->getMessage() ?: 'Access denied!';
return new Response($message, 403);
});
// Handle Resource not found errors
$app->error(function (\App\Rest\Exception\ResourceNotFound $e) {
$message = $e->getMessage() ?: 'Resource not found!';
return new Response($message, 404);
});
// Handle other exception as 500 errors
$app->error(function (\Exception $e, $code) {
return new Response($e->getMessage(), $code);
});
Проблема в том, что, когда я генерирую исключение ResourceNotFound в моем контроллере, выполняется обработчик ошибок, связанный с AccessDenied
Исправляемая фатальная ошибка: аргумент 1, передаваемый в {closure} (), должен быть экземпляром App \ Rest \ Exception \ AccessDenied, экземпляром App \ Rest \ Exception \ ResourceNotFound с указанием
Это достижимо по-другому, или я должен просто вставить все в обработчик, который работает с общими исключениями, и включить тип создаваемого исключения?
PS: я знаю о методе $app->abort()
, но предпочитаю работать с исключениями