У меня есть следующее промежуточное ПО, которое я прикреплю к своему маршруту:
class RequireAuth extends Base
{
public function __invoke(Request $request, RequestHandler $handler): Response
{
// On my way in, get authenticated user...
// I want to decide whether to redirect the response now, but i don't have
// the response object yet like I did in Slim 3.
// So, get the response instance from handler
$response = $handler->handle($request);
// Now on my way out... and too late to decide whether to redirect to /login
if ($user) {
return $response;
} else {
return $response
->withHeader('Location', '/login')
->withStatus(302);
}
}
}
Теперь это редирект работает. Однако, похоже, он перенаправляется после нажатия на приложение и на выходе. Я могу подтвердить это, поместив die('hello');
в свой контроллер. Если пользователь не аутентифицирован, он не должен заходить так далеко, поскольку перенаправление должно быть подключено по пути. Но контроллер вызывается, даже если я не аутентифицирован. Это плохо. В Slim 3 у меня был доступ к объекту $ response, и я мог передать его через обработчик $ next. Но похоже, что в Slim 4 у меня есть только обработчик запроса $, который будет попадать в приложение, прежде чем я получу ответ $, чтобы решить, хочу ли я, например, перенаправить на / login.
Как я могу вернуть перенаправляющий $ response при входе, а не при выходе?