gpt4 book ai didi

php - 如何从 Slim 4 中间件进行重定向?

转载 作者:行者123 更新时间:2023-12-01 21:54:54 27 4
gpt4 key购买 nike

我一直在测试新的 Slim 4 框架,重定向在普通类中对我来说工作得很好,但我似乎无法让它们在中间件中工作,其中响应是由请求处理程序动态生成的(显然?)。当我尝试使用 Location header 进行重定向时,它根本无法重定向,我的路线会继续到原始位置。

这是我用于测试的身份验证中间件的基本版本:

use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;

class AuthMiddleware extends Middleware {

public function __invoke(Request $request, RequestHandler $handler): Response {
$response = $handler->handle($request);
$loggedInTest = false;
if ($loggedInTest) {
echo "User authorized.";
return $response;
} else {
echo "User NOT authorized.";
return $response->withHeader('Location', '/users/login')->withStatus(302);
}
}
}

有人让这个工作吗?如果是这样,你是如何做到的?提前致谢。

最佳答案

我想我看到了这段代码的问题。

use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;

class AuthMiddleware extends Middleware {

public function __invoke(Request $request, RequestHandler $handler): Response {
$response = $handler->handle($request);
$loggedInTest = false;
if ($loggedInTest) {
echo "User authorized.";
return $response;
} else {
echo "User NOT authorized.";
return $response->withHeader('Location', '/users/login')->withStatus(302);
}
}
}

当您调用 $handler->handle($request) 时,它会正常处理请求并调用应该处理路由的任何闭包。响应尚未完成,您仍然可以向其附加内容,但 header 已经设置,因此您无法进行重定向,因为 header 已完成。

也许试试这个:

use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
use Slim\Psr7\Response;

class AuthMiddleware extends Middleware {

public function __invoke(Request $request, RequestHandler $handler): ResponseInterface {
$loggedInTest = false;
if ($loggedInTest) {
$response = $handler->handle($request);
echo "User authorized.";
return $response;
} else {
$response = new Response();
// echo "User NOT authorized.";
return $response->withHeader('Location', '/users/login')->withStatus(302);
}
}
}

如果登录测试失败,我们永远不会调用 $handler->handle(),因此不会生成正常响应。同时,我们创建一个新的响应。

请注意,ResponseInterfaceResponse 不能在同一文件中都称为 Response,因此我不得不删除该别名,并通过其真实名称调用 ResponseInterface。您可以给它起一个不同的别名,但我认为这只会造成更多困惑。

此外,我在重定向之前注释掉了回显。我认为此回显将强制自动发送 header ,这将破坏重定向。除非 Slim 4 正在做输出缓冲,在这种情况下您仍然不会看到它,因为重定向会立即将您发送到不同的页面。无论如何,我将其注释掉,以便为代码提供最佳的工作机会,但将其留在原地以供引用。

无论如何,我认为如果您做出那个小小的改变,一切都会奏效。当然,这篇文章已经发布快一年了,所以您现在可能已经自己解决了这个问题,切换到 F3,或者放弃了这个项目。但希望这对其他人有帮助。这就是 StackOverflow 的重点,对吧?

关于php - 如何从 Slim 4 中间件进行重定向?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58423327/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com