如何使SilexDebug在Silex应用程序内返回JSON


How to make SilexDebug return JSON inside Silex App

我有一个从基类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问题。