Тонкое промежуточное программное обеспечение — не получает следующий вызываемый объект

#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')

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