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 的处理程序。

不过我确实喜欢这个想法,并且应该可以通过使用反射来实现它。如果您可以在跟踪器上创建新票证,或者如果您有兴趣,甚至可以在补丁上工作,那将是很棒的。

干杯!

于 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 回答