Slim 3 PHP - 无法访问来自middleware.php的settings.php中的值

问题描述 投票:2回答:2

我有一个midleware,它检查JWT令牌上的有效签名,以获取对私有路由的GET请求。在其中,我需要提供我的JWT秘密,该秘密存储在['settings']['jwt']['secret']的settings.php中。我尝试使用$this->settings->jwt->secret访问此值并获取错误:

不在对象上下文中时使用$ this

我切换到使用$app->settings->jwt->secret并得到错误

Uncaught InvalidArgumentException:Secret必须是字符串或“kid”=>“secret”对的数组

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对象中的任何内容)?

php slim-3
2个回答
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
投票

这样的事情应该有效:

$modulesSettings = $this->get('settings')['jwt']['secret'];
© www.soinside.com 2019 - 2024. All rights reserved.