Я создаю приложение на основе Silex 1.3. Это мое первое знакомство с Silex, поэтому я не очень хорошо с ним знаком.
Я хотел бы использовать свой собственный обработчик ошибок/исключений, который в основном представляет собой класс, который регистрирует себя, а затем будет перехватывать все ошибки, фатальные ошибки и необработанные исключения и обрабатывать их либо с помощью Whoops в разработке, либо с изящным обработчиком в производстве. .
Однако, как только я окажусь внутри контроллера Silex, промежуточного программного обеспечения и т. д., Silex возьмет на себя управление и будет использовать собственную обработку ошибок. Мой по-прежнему будет ловить фатальные ошибки, поскольку Silex, по-видимому, не подключается к выключению, но все остальное заменяется страницей «Что-то пошло не так» по умолчанию от Silex.
Я понимаю, что я могу использовать $app->error(), чтобы переопределить, КАК Silex обрабатывает ошибки, но я не нашел способа вернуть оттуда исходный ErrorHandler или переопределить, НЕОБХОДИМО ли Silex обрабатывать ошибки.
Итак, кто-нибудь знает, как либо а) указать Silex использовать мой обработчик ошибок с помощью $app->error() или каким-либо другим способом, б) просто полностью отключить обработку ошибок в Silex, либо в) в качестве последнего прибегнуть к помощи Silex, чтобы он перехватывал фатальные ошибки, чтобы я мог обрабатывать все три типа из $app->error()?
Поскольку я впервые использую Silex, не стесняйтесь исправлять меня или показывать, как вы обрабатываете ошибки в Silex, если есть лучший способ, но также, пожалуйста, ответьте на вопрос, если можете.
Некоторый пример кода:
// This will register itself and then handle all errors.
$handler = new ErrorHandler();
// These are all handled appropriately.
nonexistentfunction(); // Correctly caught by ErrorHandler::handleFatalError
trigger_error("example"); // Correctly caught by ErrorHandler::handlePhpError
throw new \Exception("example"); // Correctly caught by ErrorHandler::handleException
$app = new \Silex\Application();
$app->get('/', function () use ($app) {
// This is still handled correctly.
nonexistentfunction(); // Correctly caught by ErrorHandler::handleFatalError
// However, these are now overridden by Silex.
trigger_error("example"); // INCORRECTLY DISPLAYS SILEX ERROR PAGE.
throw new \Exception("example"); // INCORRECTLY DISPLAYS SILEX ERROR PAGE.
});
$app->run();
И очень упрощенный ErrorHandler для справки:
Class ErrorHandler
{
public function __construct()
{
$this->register();
}
private function register()
{
register_shutdown_function( array($this, "handleFatalError") );
set_error_handler(array($this, "handlePhpError"));
set_exception_handler(array($this, "handleException"));
}
// Etc.
}