创建全局用户变量

时间:2018-01-05 01:59:31

标签: php slim

我很擅长瘦身并试图找出创建全局用户变量的最佳方法。我的第一个想法是将它添加到Container,但我无法弄清楚如何将$app注入到映射到类方法的路由中。我看到某处我可以将Container $container添加到构造函数中,DI应该自动执行吗?似乎没有用。

__construct(Container $container)

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

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

public function __construct($role = null)

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

1 个答案:

答案 0 :(得分:1)

您可以使用CurrentUser - 类来存储角色:

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 - 类

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'));