BootableProviderInterface 上的 silex abort() 忽略提供的代码,响应始终为 200

silex abort() on BootableProviderInterface ignores provided code, response has 200 always

我有一个 silex BootableProvider,可以在执行对我的任何端点的调用之前检查每个请求的一些要求。一切正常,除了当我使用 $app->abort('403', 'forbidden for some reason');在 boot() 方法中的任何地方,响应总是 returns 代码 200。 'forbidden' 消息正确显示,幸运的是执行按预期中断,但响应中没有有意义的状态代码使其 hard/cumbersome 来处理这些失败响应。

我正在使用 silex 2.0.4。

但是,如果我从实现 ControllerProviderInterface 的任何端点执行 $app->abort(...),在同一请求线程中,响应具有我在中止中指定的正确响应代码,因此我认为这是一个时间问题。

非常感谢任何建议。

示例代码:

class BootProvider implements BootableProviderInterface {


    function boot(Application $app) {
        $app->abort(403, 'not allowed');
    }

}

...

$app->register(new My\Api\BootProvider());

我试过通过 headers 来覆盖状态,但没有成功。

谢谢!

在你的情况下你应该得到异常 Fatal error: Uncaught exception...。服务提供程序在内核句柄循环之前启动,因此不会处理错误。

尝试添加将在控制器之前执行并进行所有检查的事件侦听器或中间件。

$app->before(function (Request $request, Application $app) {
    $app->abort(403, 'not allowed');
});

http://silex.sensiolabs.org/doc/2.0/middlewares.html