Silex で、スローされた例外に基づいてエラー ハンドラを使用することは可能ですか?
これは、単一の例外ハンドラーと、スローされた例外のクラス名の switch ステートメントで可能であることを知っていますが、「Silex の方法」の方がクリーンなように見えますが、機能しません。
これは私がそれがうまくいくと期待する方法です
<?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 に関連付けられたエラーハンドラーが実行されることです。
キャッチ可能な致命的なエラー: {closure}() に渡される引数 1 は、App\Rest\Exception\AccessDenied のインスタンスである必要があります。与えられた App\Rest\Exception\ResourceNotFound のインスタンスです。
これは別の方法で達成できますか、それとも一般的な例外で動作するハンドラーにすべてを詰め込み、スローされる例外の種類をオンにする必要がありますか?
PS:私はその$app->abort()
方法を知っていますが、例外を扱うことを好みます