2016-12-13 1 views
0

slim frameworkで単純なAPIを作成しています。要求のあるスリムパス属性

ミドルウェアを作成して、アプリケーションに渡されたトークンが有効で有効期限が切れていないかどうかを確認したいと考えました。

これはミドルウェアです:

public function __invoke(Request $request, Response $response, $next) 
{ 
    $token = $request->getParam('token', null); 
    if (is_null($token)) { 
     throw new NoTokenException(); 
    } 

    /** @var Auth $authModule */ 
    $authModule = $this->getContainer()->get('AuthModule'); 
    $tokenModel = $authModule->validateToken($token); 

    $request = $request->withAttribute('user_token_data', $tokenModel->getAttributes()); 

    return $next($request, $response); 
} 

それはかなり簡単です。トークンを検証し、新しい属性を$ requestパラメータに追加します。

私は次のことをやった私のルートで

:ルートのコールバックで

$app->post('/test', function($request, $response, $args){ 

    /** @var \Controller\TestController $testController */ 
    $testController = $this->get('TestController'); 

    $testController->testFunction(); 


})->add(new \Middleware\Test\SomeOtheroMiddleware($app->getContainer())) 
    ->add(new \Middleware\AuthMiddleware($app->getContainer())); 

私がしなければ$request->getAttribute('user_token_data')、すべての場所です。

しかし、私のコントローラは、スリムなコンテナがロードされているので、私はここで __constructor()

$request変数の上に渡したいが、私のコンテナです:

$container['TestController'] = function ($container) { 
    $testModule = $container->get('TestModule'); 
    $request = $container->get('request'); 
    return new \Controller\TestController($testModule, $container, $request); 
}; 

すべては、エラーをロードしていないですが、中私のTestController->testFunction()私がコンテナを渡した変数$requestにアクセスしようとすると、私はuser_token_dataキーを持っていません。

コントローラのセッターを作成してルート内の$requestを変更することはできますが、これは良い考えのようには聞こえません。

私はコンテナからの$requestが同じインスタンスではないことを知りたいと思います。そして、私はセッターなしでこれをどうやって行うことができますか?

ご協力いただければ幸いです。

+0

コンテナからのリクエストは使用しないでください。失効したデータが含まれています。 –

+0

@MikaTuupolaあなたは何をお勧めしますか? –

答えて

1

もっと良いアプローチは、コントローラに直接ルーティングすることによってSlimを使用することです。 TestControllerに直接routeA機能渡される/routeAに任意のPOST要求を引き起こします

$app->post('/routeA', ['TestController', 'routeA'])->add(new \Middleware\Test\SomeOtheroMiddleware($app->getContainer())) 
    ->add(new \Middleware\AuthMiddleware($app->getContainer())); 

と:たとえば

class TestController { 
    function routeA($request, $response) { 
     $tokenData = $request->getAttribute('user_token_data'); 
     // Your logic here 
     // in the end, return the response 
     // for example: return $response->withJson(['test' => $tokenData]); 
    } 
} 

そして、あなたのルートで、次を使用します$request$responseはSlimによって注入されます。

これは、コードをより整理し、コンテナと結合しにくくします。

$requestがコンテナ内で同じでない理由は、コンテナにSlimによって解析された元の$requestが含まれていて、ミドルウェアを通過するとコンテナ内で更新されないためです。 $requestオブジェクトは不変なので、あるミドルウェアから他のミドルウェアへとあなたのルートに渡されただけなので、コンテナは変更を認識しません。

関連する問題