我很擅长瘦身并试图找出创建全局用户变量的最佳方法。我的第一个想法是将它添加到Container,但我无法弄清楚如何将$app
注入到映射到类方法的路由中。我看到某处我可以将Container $container
添加到构造函数中,DI应该自动执行吗?似乎没有用。
__construct(Container $container)
另外,我需要访问我编写的中间件类中的变量来解析我的Bearer标头,我找不到有关如何执行此操作的任何详细信息。我知道我可以将$app
传递给每个->add
,但这是很多重复的代码,我希望我可以避免这种情况。我已经注入了一个额外的变量来解析角色:
->add(new \App\Middleware\AuthMiddleware('admin'));
public function __construct($role = null)
我总是可以创建一个PHP全局,但是我想弄清楚正确的Slim方法是做什么的。
答案 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'));