我有一个中间件软件,用于检查JWT令牌上的有效签名,以获取对私有路由的GET请求。在其中,我需要提供JWT机密,该机密存储在['settings']['jwt']['secret']
的settings.php中。我尝试使用$this->settings->jwt->secret
访问此值并收到错误:
不在对象上下文中时使用$ this
我切换为使用$app->settings->jwt->secret
并收到错误消息
未捕获的InvalidArgumentException:机密必须是字符串或 “孩子” =>“秘密”对的数组
middleware.php
$app->add(new \Tuupola\Middleware\JwtAuthentication([
"path" => "/api", /* or ["/api", "/admin"] */
"attribute" => "decoded_token_data",
"secret" => $this->settings->jwt->secret,
"algorithm" => ["HS256"],
"error" => function ($response, $arguments) {
$data["status"] = "error";
$data["message"] = $arguments["message"];
return $response
->withHeader("Content-Type", "application/json")
->write(json_encode($data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT));
}, ]));
settings.php
return [
'settings' => [
'displayErrorDetails' => true, // set to false in production
'addContentLengthHeader' => false, // Allow the web server to send the content-length header
// Renderer settings
'renderer' => [
'template_path' => __DIR__ . '/../templates/',
],
// Monolog settings
'logger' => [
'name' => 'slim-app',
'path' => isset($_ENV['docker']) ? 'php://stdout' : __DIR__ . '/../logs/app.log',
'level' => \Monolog\Logger::DEBUG,
],
// database connection details
"db" => [
"host" => "127.0.0.1",
"dbname" => "sity",
"user" => "root",
"pass" => "",
],
// jwt settings
"jwt" => [
'secret' => 'jwtsecret',
],
],
];
访问该值(或与此相关的settings
对象中的任何内容)的正确方法是什么?
答案 0 :(得分:1)
根据文档(http://www.slimframework.com/docs/v3/objects/application.html):
Slim还使用了许多设置。这些存储在设置配置密钥中。您还可以添加特定于应用程序的设置。
由于设置存储在DI容器中,因此您可以通过容器工厂中的设置键来访问它们。
因此,在添加中间件之前,请继续获取设置,因为错误指示您不在对象上下文中。
$container = $app->getContainer();
$jwtSettings = $container->get('settings')['jwt'];
然后在$app->add()
内,您应该能够获得令牌,例如:
"secret" => $jwtSettings['secret'],
答案 1 :(得分:-1)
类似的东西应该起作用:
$modulesSettings = $this->get('settings')['jwt']['secret'];