Тонкий php, останавливается, умирает после отправки кода состояния ответа 403 в небольшом промежуточном программном обеспечении

#php #slim

#php #тонкий

Вопрос:

Я создал небольшую промежуточную функцию для slim php framework, которая проверяет, аутентифицирован ли пользователь или нет, вот так.

 function authenticate($app) {
    return function() use ($app) {
        if (!isset($_SESSION['user'])) {
            $response = array();
            array_push($response, array(
                    'error' => true,
                    'message' => 'You are not logged in.'
                )
            );
            echoRes(403, $response);
        }
    };
}
  

Что произойдет, если я попытаюсь вставить его в маршрут, подобный этому:

 $app->get('/', authenticate($app), function() use ($app){
     echoRes(200, 'hello world!');
});
  

Функция echoRes

 function echoRes($code, $response) {
    $app = SlimSlim::getInstance();
    $app->status($code);
    $app->contentType('application/json');
    echo json_encode($response);
}
  

Что происходит, так это то, что он будет продолжать выдавать мне код состояния 200 , даже если он не аутентифицирован, даже если я убью его с помощью die() ;

 function authenticate($app) {
    return function() use ($app) {
        if (!isset($_SESSION['user'])) {
            $response = array();
            array_push($response, array(
                    'error' => true,
                    'message' => 'You are not logged in.'
                )
            );
            echoRes(403, $response);
            die();
        }
    };
}
  

Ответ №1:

Я использую $app-> notfound() или $ app-> halt(403), чтобы остановить выполнение. Нет необходимости устанавливать код состояния, поскольку он задается этими функциями.

Ответ №2:

Если вы используете версию 2.2.0 (я не уверен, применимо ли это в более поздней версии), а также должны добавить ответ JSON после установки статуса ответа 403, тогда вы можете использовать $app->stop() . Использование $app->halt(arg) удаляет содержимое тела.

Ответ №3:

В Slim 3.0 функции halt() и stop() больше не существуют. Ссылка: http://www.slimframework.com/docs/v3/start/upgrade.html#removal-of-stophalt

Вам нужно использовать -> withJson():

 return $response->withJson([
  'error' => true,
  'message' => 'You are not logged in.'
], 403);
  

Комментарии:

1. Проблема с этим способом заключается в том, что иногда другие функции все еще выполняются, поэтому вы не можете гарантировать остановку программы при вызове этого.

2. Поскольку есть возврат, никакие другие функции выполняться не будут.