2016-08-22 4 views
1

В настоящее время я пишу REST API с помощью Slim Framework 3 и реализую Middleware для базовой проверки подлинности.

Моя маршрутизация выглядит следующим образом:

$app->group('/api', function() use ($app, $pdo) { 
    $this->group('/v1', function() use ($app, $pdo) { 

     // Guest Routes 
     $this->group('', function() use ($app, $pdo) { 
      require_once '../app/api/v1/authentication.php'; 
     }); 

     // Authenticated Routes 
     $this->group('', function() use ($app, $pdo) { 
      require_once '../app/api/v1/test.php'; 
     })->add(new \App\Middleware\AuthMiddleware($pdo)); 

    }); 
}); 

В классе AuthMiddleware я использую метод __invoke следующим образом:

namespace App\Middleware; 

use \Psr\Http\Message\ServerRequestInterface as Request; 
use \Psr\Http\Message\ResponseInterface as Response; 

class AuthMiddleware extends Middleware { 

/** 
* @param Request $request 
* @param Response $response 
* @param $next 
* @return Response 
*/ 
    public function __invoke(Request $request, Response $response, $next) { 

     $response = $next($response, $request); 

     return $response; 
    } 

} 

И я получаю следующее сообщение об ошибке:

Argument 1 passed to Slim\Route::__invoke() must implement interface Psr\Http\Message\ServerRequestInterface, instance of Slim\Http\Response given

по следующей строке:

$response = $next($response, $request); 

Что происходит? есть идеи? Я ел себя над этим в течение 2-х часов :(

Благодаря кучу!

+0

Похоже, вы смешиваете тонкие версии. Подпись метода для маршрута в v ersion 3 является '$ app-> get ('/ path', function (Request $ request, Response $ response) {...});' в группе вы просто используете '$ this' и не нужно использовать' (приложение) '. Также в вашей настройке slim вы можете добавить 'pdo' var в контейнер, а затем получить доступ к нему, как:' $ this-> pdo-> methodName(); ' – nerdlyist

+0

Спасибо @nerdlyist, но когда я добавляю pdo в контейнер PHPStorm просто останавливает автозаполнение для методов pdo. – EpicSyntax

+0

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

ответ

3

Тупо .. Я заметил, что на

$response = $next($response, $request); 

я отменил параметры .. должны быть

$response = $next($request, $response); 

Blaahh ... у меня болит голова.