#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. Поскольку есть возврат, никакие другие функции выполняться не будут.