我有一个从基类Exception派生的抛出错误的类。
应用程序的核心是Silex微框架-但由于我对Laravel比Symfony更熟练(尽管Laravel是从它派生的),我倾向于使用一些来自illuminate的包(因此你会看到一些use Illuminate'
)
我想在发生错误时抛出异常,但我得到的是集成的Whoops。我想返回JSON代替。(不是全栈,而是Symfony'component'debug)
理想的array('status' => <code>, 'message_content');
问题是:a)我如何做到这一点,考虑到它的silex与调试看起来像呜呜(这个服务是默认开启的)。b)是否有一种方法可以使用扩展Exception的类,或者我是否需要从头开始创建一个适合我需要的全新Exception类
namespace Api'Manager'Validation;
use Illuminate'Support'MessageBag;
class ValidationException extends 'Exception {
/**
* @var MessageBag
*/
protected $errors;
/**
* @param string $message
* @param MessageBag $errors
*/
function __construct($message, MessageBag $errors)
{
$this->errors = $errors;
parent::__construct($message);
}
/**
* Get form validation errors
*
* @return MessageBag
*/
public function getErrors()
{
return $this->errors;
}
}
我假设你正在使用WhoopsServiceProvider集成到Silex -你应该有以下在你的app.php或index_dev.php。
$app->register(new WhoopsServiceProvider());
你可以在这里看到它的代码。
它似乎硬编码了pretypagehandler。
$app['whoops.error_page_handler'] = $app->share(function() {
return new PrettyPageHandler;
});
如果你把这个提供程序复制到你自己的提供程序中,那么你应该可以用JsonRespondeHandler来替换它。
您还需要删除Provider中的一些其他代码。例如:呜呜声。silex_info_handler不会为你工作,因为它包括一些调用,如addDataTable(),我认为这是特定于pretypagehandler类。
$app['whoops'] = $app->share(function() use($app) {
$run = new Run;
$run->allowQuit(false);
$run->pushHandler($app['whoops.error_page_handler']);
$run->pushHandler($app['whoops.silex_info_handler']);
return $run;
});
没有实际测试以上,我相信这应该意味着所有由Whoops捕获的异常都将以JSON呈现,所以你不会(也不应该)需要创建单独的异常类来专门呈现JSON。
实际上比这要简单得多。只需在"$app = new Silex'Application();"之后的index_dev.php中添加以下内容。
$app->error(function ('Exception $e, $code) use($app) {
return $app->json(array("error" => $e->getMessage()),$code);
});
异常将作为JSON输出。答案其实来自于另一个SO问题。