创建全局用户变量
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'));
我是 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'));