2012-03-23 68 views
4

它可能在Silex中使用基于抛出异常的错误处理程序吗?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例外,绑存取遭拒的的ErrorHandler执行

Catchable fatal error: Argument 1 passed to {closure}() must be an instance of App\Rest\Exception\AccessDenied, instance of App\Rest\Exception\ResourceNotFound given

是这个实现在另一种方式,或者我应该只是在处理与泛型异常的处理程序中的所有东西,并打开抛出的异常类型?

PS:我知道了$app->abort()方法,但喜欢与例外

回答

5

编辑工作:该功能已经使它成为Silex的核心!


这是目前不可能的。现在你不得不使用一个switch语句的单个处理程序,或者每个处理程序都有if ($e instanceof MyException)

虽然我确实喜欢这个想法,但应该可以使用反射来实现它。如果你有兴趣,如果你可以创建一张新门票on the tracker,或者甚至在一个补丁上工作,那将是非常棒的。

干杯!

+0

嘿伊戈尔,非常感谢,我其实只是把建议的邮件列表,可以请你检查它,并给一些反馈,那么我会完成它并发送拉请求。 – ChrisR 2012-03-26 12:41:25

+0

是的,这是个好主意。 – Meglio 2012-04-26 21:48:58

+0

我已经更新了我的答案,因为此功能现在可在silex核心中使用。 :) – igorw 2013-04-04 13:36:17

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; 
}); 
相关问题