5

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()方法を知っていますが、例外を扱うことを好みます

4

2 に答える 2

5

編集: この機能は Silex コアになりました!


これは現在不可能です。現時点では、switch ステートメントを含む単一のハンドラー、またはif ($e instanceof MyException)each を含む多数のハンドラーのいずれかが必要です。

私はこのアイデアが好きですが、リフレクションを使用して実装できるはずです。興味があれば、 trackerで新しいチケットを作成したり、パッチに取り組んだりできれば最高です。

乾杯!

于 2012-03-24T22:46:47.350 に答える
0

プロジェクトで使用する別のソリューション:

class ProcessCallbackException extends Exception
{
    public function __construct(\Closure $callback, $message = "", Exception $previous = null)
    {
        parent::__construct($message, 0, $previous);
        $this->callback = $callback;
    }

    public $callback;
}

class AccessDeniedException extends ProcessCallbackException
{
    public function __construct($message = null)
    {
        $f = function() {
            return app()->redirect('/login');
        };

        parent::__construct($f, $message);
    }
}

# Handle your special errors
$app->error(function (\Exception $e, $code) {
    if ($e instanceof ProcessCallbackException)
    {
        /** @var ProcessCallbackException $callbackException */
        $callbackException = $e;
        return call_user_func($callbackException->callback);
    }
    else
        return null;
});
于 2012-04-26T22:16:49.317 に答える