创建全局用户变量

Creating a global user variable

我是 slim 的新手,正在尝试找出创建全局用户变量的最佳方法。我的第一个想法是将它添加到容器中,但我不知道如何将 $app 注入到映射到 class 方法的路由中。我在某处看到我可以将 Container $container 添加到构造函数并且 DI 应该自动执行吗?好像没用。

__construct(Container $container)

另外,我需要访问我编写的中间件 class 中的变量来解析我的 Bearer header,但我找不到有关如何执行此操作的任何详细信息。我知道我可以将 $app 传递给每个 ->add,但这是很多重复的代码,我希望我能避免这种情况。我已经注入了一个额外的变量来解析角色:

->add(new \App\Middleware\AuthMiddleware('admin'));

public function __construct($role = null)

我总是可以创建一个 PHP 全局的,但我想弄清楚正确的 Slim 方法是什么。

您可以使用存储角色的 CurrentUser-class 执行此操作:

class CurrentUser {
    private $roles;
    function getRoles() {return $this->roles; }
    function setRoles($newRoles) {$this->roles = $newRoles; }
}

然后您可以将其添加到容器中:

$container[CurrentUser::class] = function($c) {
    $user = new CurrentUser();
    $user->setRoles(['myrole']);
    return $user;
};

并在辅助方法中使用 CurrentUser-对象,动态创建我们想要的中间件。这个方法也可以在CurrentUser-class

function hasPermission($role) {
    return function($req, $resp, $next) use ($role) {
        if(in_array($role, $this[CurrentUser::class]->getRoles())) {
            return $next($res, $resp); // proceed to route
        } else {
            // handle unauthorized
            return $resp->withStatus(401)->write('unauthorized');
        }
    };
}

现在使用辅助方法创建授权用户的中间件。

$app->get('/books', function ($request, $response, $args) {
    return $response->write('Some books yay');
})->add(hasPermission('myrole'));