#php #slim #middleware
#php #тонкий #промежуточное программное обеспечение
Вопрос:
У меня есть нижеприведенное промежуточное программное обеспечение, и я пытаюсь вызвать его для маршрутов, которые необходимо аутентифицировать. При срабатывании __invoke третьим аргументом является пустой массив вместо следующего вызываемого промежуточного программного обеспечения из стека.Мои другие промежуточные ПРОГРАММЫ работают нормально, и единственное отличие от этого — конструктор. Может ли это быть проблемой?
Я также предполагаю, что предыдущий стек промежуточного программного обеспечения работает хорошо, потому что, когда я удаляю этот из стека, приложение работает так, как ожидалось.
Ошибка, которую я получаю, это Fatal error: Function name must be a string
Рассматриваемая строка — это, $response = $next($request,$response);
где $next
— пустой массив.
Тонкая версия 3
namespace RealEstateCommunicationServiceMiddleware;
use GuzzleHttpClient;
use SlimHttpRequest;
use SlimHttpResponse;
class SecuredRouteMiddleware
{
const SCOPE_NAME = 'messages';
public function __construct(Client $guzzle){
$this->guzzle = $guzzle;
}
public function __invoke(Request $request,Response $response,$next){
$response = $next($request,$response);
$uacResponse = $this->guzzle->request('GET','http://rees-uac.dev/resource/'.self::SCOPE_NAME.'/validate',[
'headers' => [
'Authentication' => $request->getHeader('Authentication')
]
]);
return $response;
}
}
Комментарии:
1. Эта строка $response = $next ($request, $ response) такая странная. Зачем вам это нужно?
2. Цитируя документацию
It can do whatever is appropriate with these objects. The only hard requirement is that a middleware MUST return an instance of PsrHttpMessageResponseInterface. Each middleware SHOULD invoke the next middleware and pass it Request and Response objects as arguments.
, вы заставили меня задуматься о том, что происходит, когда я его не вызываю. BRB
Ответ №1:
Проблема была вызвана использованием объявления промежуточного программного обеспечения маршрута из Slim2
Там вы могли бы сделать $app->get('route','Middleware','Callback')
Но в SF3 вы должны объявить это как $app->get('route','Callback')->add('Middleware')
Это заставило приложение думать, что промежуточное программное обеспечение на самом деле является обратным вызовом.