Slim 4:如何获取初始URL以实现登录后重定向
在Slim PHP v4中实现登录后重定向到原访问页面
要解决登录后无法回到原访问页面的问题,核心是在重定向到登录页前把用户原本要访问的URL存入会话(Session),登录验证通过后再从会话中取出这个URL完成跳转。
1. 修改登录重定向中间件,保存原访问URL
在你的RedirectVisitorToLogin中间件中,添加会话存储逻辑,把用户当前请求的URL存起来(注意排除登录页面本身,避免循环重定向):
<?php namespace App\Middleware; use App\Middleware\Middleware; use Slim\Routing\RouteContext; use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Http\Server\RequestHandlerInterface as RequestHandler; class RedirectVisitorToLogin extends Middleware { public function __invoke(Request $request, RequestHandler $handler) { // 先确保会话已启动(如果应用全局没启动的话) if (session_status() === PHP_SESSION_NONE) { session_start(); } if (!$this->c->get('auth')->check()) { $routeParser = RouteContext::fromRequest($request)->getRouteParser(); $loginPath = $routeParser->urlFor('auth.signin'); $currentPath = $request->getUri()->getPath(); // 仅当当前页面不是登录页时,保存原访问路径 if ($currentPath !== $loginPath) { $_SESSION['redirect_url'] = $currentPath; } return $handler->handle($request) ->withHeader('Location', $loginPath) ->withStatus(302); } return $handler->handle($request); } }
2. 登录验证成功后,重定向到原URL
在你的登录处理逻辑(比如AuthController的登录方法)中,验证用户凭证通过后,从会话中取出保存的URL进行跳转,跳转后记得清除会话中的记录:
<?php namespace App\Controllers; use Slim\Routing\RouteContext; use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Http\Message\ResponseInterface as Response; class AuthController { public function signin(Request $request, Response $response) { // 假设这里是获取用户提交的登录凭证逻辑 $credentials = $request->getParsedBody(); $auth = $this->c->get('auth'); $routeParser = RouteContext::fromRequest($request)->getRouteParser(); if ($auth->attempt($credentials)) { // 优先使用会话中保存的原URL,没有则跳转到默认页面(比如仪表盘) $redirectUrl = $_SESSION['redirect_url'] ?? '/dashboard'; // 清除会话中的记录,避免后续重复跳转 unset($_SESSION['redirect_url']); return $response ->withHeader('Location', $redirectUrl) ->withStatus(302); } // 登录失败的处理逻辑(比如返回错误信息到登录页) return $response->withHeader('Location', $routeParser->urlFor('auth.signin'))->withStatus(302); } }
注意事项
- 确保你的Slim应用已经正确启用了会话机制,如果全局没启动会话,需要在中间件或应用初始化阶段调用
session_start()。 - 如果原访问URL带有查询参数(比如
/report?date=2024),可以用$request->getUri()->__toString()来保存完整URL,而不仅仅是路径。
内容的提问来源于stack exchange,提问作者cesarcarlos
相关产品推荐
相关产品推荐

