silex abort() на BootableProviderInterface игнорирует предоставленный код, ответ всегда имеет 200

У меня есть Silex BootableProvider для проверки некоторых требований по каждому запросу перед выполнением вызовов любой из моих конечных точек. Все работает хорошо, за исключением того, что когда я использую $app->abort('403', 'запрещено по какой-то причине'); в любом месте метода boot() ответ всегда возвращает код 200. Сообщение «запрещено» отображается правильно, и выполнение, к счастью, прерывается, как и ожидалось, но отсутствие значимого кода состояния в ответе затрудняет/затрудняет обработку этих ошибок. ответы.

Я использую силекс 2.0.4.

Однако, если я выполню $app->abort(...) из любой из моих конечных точек, которые реализуют ControllerProviderInterface, в том же потоке запросов, ответы будут иметь правильные коды ответов, которые я указываю в прерывании, поэтому я думаю, что это вопрос времени.

Любые советы очень ценятся.

Образец кода:

class BootProvider implements BootableProviderInterface {


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

}

...

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

Я пытался передать заголовки, чтобы переопределить статус, но безрезультатно.

Спасибо!


person Alexander Wallace    schedule 15.02.2017    source источник


Ответы (1)


В вашем случае вы должны получить только исключение 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

person Max P.    schedule 16.02.2017
comment
Действительно, вызов моего метода при загрузке генерировал просто необработанное исключение. Ваше предложение идеально подходит для моего использования. Это именно то, что мне было нужно, я очень ценю это! (ps. Я проголосовал, но мне не хватило голосов, чтобы это показать. Спасибо!) - person Alexander Wallace; 16.02.2017