【发布时间】:2016-12-13 08:00:41
【问题描述】:
我正在使用 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 不是同一个实例。没有二传手我怎么能做到这一点。
任何帮助将不胜感激。
【问题讨论】:
-
您不应该使用来自容器的请求。它包含过时的数据。
-
@MikaTuupola 那你有什么建议呢?