如何让Silex \ Debug在Silex App中返回JSON

时间:2014-07-09 21:18:08

标签: php json symfony silex

我有一个类会抛出从基础Exception扩展的错误。

App的核心是Silex Micro-Framework - 但由于我在Laravel上比Symfony更流畅(尽管Laravel是从它衍生出来的)我倾向于使用一些来自照明的包(因此原因)为什么你会看到一些use Illuminate\

我想在发生错误时抛出异常,但我得到了集成的Whoops。我想要返回JSON。 (它不是完整的堆栈呐喊,而是Symfony \ component \ debug)

理想情况下array('status' => <code>, 'message_content');

问题是:a)我如何考虑使用看起来像whoops的调试的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;
}

}

1 个答案:

答案 0 :(得分:4)

我假设您正在使用WhoopsServiceProvider集成到Silex中 - 您应该在app.php或index_dev.php中包含以下内容。

$app->register(new WhoopsServiceProvider());

您可以看到此here的代码。

似乎对PrettyPageHandler进行了硬编码。

$app['whoops.error_page_handler'] = $app->share(function() {
    return new PrettyPageHandler;
});

如果您将此提供程序分叉/复制到您自己的提供程序中,那么您应该能够将其替换为JsonRespondeHandler。

您还需要删除提供程序中的一些其他代码。例如whoops.silex_info_handler不适合你,因为它包含一些调用,如addDataTable(),我认为这些调用特定于PrettyPageHandler类。

$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

<强>更新

实际上比这更直接。在&#34; $ app = new Silex \ Application();&#34;。

之后,将下面放在index_dev.php中。
$app->error(function (\Exception $e, $code) use($app) {
    return $app->json(array("error" => $e->getMessage()),$code);
});

然后异常将作为JSON输出。解决方案实际上来自另一个SO问题here