Как реагировать на промежуточную платформу PHP

Я создаю промежуточное ПО для авторизации в REST API. Мой API создан с использованием Slim PHP Framework, который в случае предоставления отличных функций для создания API. Одна из этих особенностей – Middleware.
Мне нужно проверить учетные данные в Middleware и ответить с ошибкой (код HTTP с описаниями JSON) пользователю.
Но, к сожалению, Slim Framework дает мне исключение всякий раз, когда я пытаюсь остановить и ответить HTTP-кодом.

<?php require_once __DIR__.'/../Slim/Middleware.php'; class TokenAuth extends \Slim\Middleware { private $auth; const SECURED_URI_REGEX = "/^\/v\d\/store\/(orders|users|payment).*/"; const TOKEN_PARAMETER = "token"; const USER_EMAIL_PARAMETER = "user_email"; public static $credentialsArray = array(TokenAuth::TOKEN_PARAMETER,TokenAuth::USER_EMAIL_PARAMETER); public function __construct() { } public function deny_access() { print Response::respondWithHttpStatus($app,401,true); } public function call() { $app = $this->app; $uri = $app->request->getResourceUri(); if (preg_match(TokenAuth::SECURED_URI_REGEX, $uri)) { $tokenAuth = $app->request->headers->get('Authorization'); if(isset($tokenAuth)) { $parsedCredentials = TokenAuth::parseAndValidateCredentials($tokenAuth); if (!$parsedCredentials) { Response::respondWithHttpStatus($app,401,true); } else { $auth = new Authenticator($parsedCredentials[TokenAuth::USER_EMAIL_PARAMETER],$app); print $auth->userHasToken(); } } else { Response::respondWithHttpStatus($app,400,true); } } else { $this->next->call(); } } 

Метод responseWithHttpStatus использует метод slim framework $ app-> halt ($ code, $ response);

В этом случае, когда я пытаюсь выполнить этот метод, я получаю Исключение из

 Slim Framework The application could not run because of the following error: Details Type: Slim\Exception\Stop File: /var/www/api/Slim/Slim.php Line: 1022 

Как справиться с этой проблемой.
Моя цель – контролировать учетные данные пользователя в промежуточном программном обеспечении, и если что-то не так, ответьте соответствующим HTTP-кодом и JSON-сообщением, описывающим причину ошибки.
Может быть, лучше следовать по-другому.
Пожалуйста, предложите.

ОДНА ВОЗМОЖНАЯ РАБОЧАЯ ЧАСТЬ

  $app->response->setStatus(400); $app->response->headers->set('Content-Type', 'application/json'); print Response::respondWithHttpStatus($app,400,false); 

И функция ответа

public static function basicRespond ($ app, $ code, $ message, $ halt) {

  if(!isset($message) || empty($message)) { $message = Response::$RESPONSE_MAP[$code]; } $response = json_encode($message); if($halt===true) { $app->halt($code, $response); } else { return $response; } } 

Для моих потребностей хорошо подходит, а также исключение может быть другим решением, но в моем случае мне не нужно продолжать, просто устанавливая заголовок, код и не вызываю следующий – работает для меня.

Вы не можете использовать halt в промежуточном программном обеспечении:

https://stackoverflow.com/a/10201595/2970321

Halt следует вызывать только в контексте обратного вызова маршрута.

Вместо этого вы можете вручную генерировать ответ 400 используя header PHP вместе с exit :

 header("HTTP/1.1 400 Access denied"); exit; 

С другой стороны,

вы можете определить новый тип исключения:

 class AuthException extends Exception { public function __construct() { $message = 'You must authenticate to access this resource.'; $code = 400; } } 

Поймайте это в своем маршруте error :

 $app->error(function (\Exception $e) use ($app) { // Example of handling Auth Exceptions if ($e instanceof AuthException) { $app->response->setStatus($e->getCode()); $app->response->setBody($e->getMessage()); } }); 

И AuthException когда авторизация будет запрещена:

 throw new AuthException(); 

По сути, это делается в Slim-Auth .