Slim 3 PHP - не может получить доступ к значениям в settings.php из middleware.php - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть промежуточное ПО, которое проверяет правильность подписи на токене JWT для запросов GET к частным маршрутам.В нем мне нужно указать свой секрет JWT, который хранится в файле settings.php по адресу ['settings']['jwt']['secret'].Я попытался получить доступ к этому значению с помощью $this->settings->jwt->secret и получил ошибку:

Используя $ this, когда не в контексте объекта

Я переключился на использование $app->settings->jwt->secret и получилошибка

Uncaught InvalidArgumentException: секрет должен быть либо строкой, либо массивом пар "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 объекте?)

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

В соответствии с документацией (http://www.slimframework.com/docs/v3/objects/application.html):

Существует также ряд настроек, которые используются Slim. Они хранятся в ключе конфигурации настроек. Вы также можете добавить свое приложение для конкретного приложения.settings.

Поскольку настройки хранятся в контейнере DI, поэтому вы можете получить к ним доступ с помощью ключа настроек на фабриках контейнеров.

Итак, прежде чем добавлять промежуточное ПО, продолжайте изахватите настройки, поскольку, как указывает ошибка, вы не находитесь внутри контекста объекта.

$container = $app->getContainer();
$jwtSettings = $container->get('settings')['jwt'];

Тогда внутри $app->add() вы сможете получить токен, подобный:

"secret" => $jwtSettings['secret'],
0 голосов
/ 07 февраля 2019

примерно так должно работать:

$modulesSettings = $this->get('settings')['jwt']['secret'];
...