php 如何将变量发送到Bramus路由器

rhfm7lfc  于 2023-03-28  发布在  PHP
关注(0)|答案(1)|浏览(130)

我有一个API后端,它使用Bramus PHP路由器并验证Auth0中的JWT。这一切都很好,但我希望扩展功能并从JWT中获取更多信息,然后将其传递给API调用。
也就是说,当用户进行API调用时,他们将用户ID作为URL中的变量发送。然而,该值已经在JWT中,因此为了安全起见,我希望将用户ID从JWT中取出,而不是通过URL传递。
下面是我尝试使用的路由代码片段:

....
  $router->before('GET|POST', '/api.*', function() use ($app) {
    $userid = '12345';
  });

  // Check for read:messages scope
  $router->before('GET', '/api/private-scoped', function() use ($app) {
    if (!$app->checkScope('read:messages')){
      header('HTTP/1.0 403 forbidden');
      header('Content-Type: application/json; charset=utf-8');
      echo json_encode(array("message" => "Insufficient scope."));
      exit();
    }
  });

  $router->get('/api/users/get-info/(\w+)', function($userid) use ($app) {
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode($app->getUserInfo($userid));
  });

  $router->get('/api/users/test', function() {
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode(array("user" => $userid));
  });
....

当我访问/api/users/test时,我得到以下响应:

{
    "user": null
}

我怎样才能让变量$userid传递到路由器中,以便我可以在其他函数中使用它?

q9rjltbz

q9rjltbz1#

你在这里看到的问题是一个PHP作用域问题,而不是一个特定的bramus/router- *,我是 * - issue的作者。因为你在before可调用函数中定义了$user,所以它只能在它的当前作用域中使用(例如在函数的{}之间)。因此你不能在所述函数之外访问它。
有几种方法可以解决这个问题,因为我看到您已经将$app变量注入到before回调函数和其他函数中,所以我建议您将$userid存储到$app中,并且总是从那里读取它。
大概是这样的

....
  $router->before('GET|POST', '/api.*', function() use ($app) {
    $app->set('userid', '12345');
  });

  // Check for read:messages scope
  $router->before('GET', '/api/private-scoped', function() use ($app) {
    if (!$app->checkScope('read:messages')){
      header('HTTP/1.0 403 forbidden');
      header('Content-Type: application/json; charset=utf-8');
      echo json_encode(array("message" => "Insufficient scope."));
      exit();
    }
  });

  $router->get('/api/users/get-info/(\w+)', function($userid) use ($app) {
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode($app->getUserInfo($userid));
  });

  $router->get('/api/users/test', function() use ($app) {
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode(array("user" => $app->get('userid')));
  });
....

相关问题