在中间件中重定向请求的正确方法是什么?

What is the correct way to redirect a request in middleware?

我正在尝试将著名的 improved persistent session 实现为 Slim 微框架中的中间件。

在描述的算法中有一些地方应用程序应该检查用户的 cookie 并在用户的 cookie 过期或无效时重定向用户。不幸的是,由于两个原因,不可能从中间件中重定向用户:

  1. Slim 的 redirect 只能在命名路由中使用;
  2. redirect 将创建一个全新的请求,从而重新启动 Slim 应用程序。之前触发重定向的相同条件将被重新触发,从而形成无限循环。

问题 1 可以通过巧妙地使用 hooks 来解决,但我不确定如何解决问题 2。我注意到 some middleware 通过使用自定义异常解决了这个问题,然后他们用 Slim 的错误处理程序,然后调用重定向:

// Handle the possible 403 the middleware can throw
$app->error(function (\Exception $e) use ($app) {
    ...
    if ($e instanceof HttpUnauthorizedException) {
        return $app->redirectTo('login');
    }
    ...
});

但我不确定这是最好的方法。还有其他方法可以实现吗?

您上面列出的是一种非常好的实现方式,而且通常是这样做的。假设您的登录页面不检查 HttpUnauthorizedExcepion,它就不可能重定向循环。