无法在 Slim Framework 控制器 __construct() 中执行重定向

Cannot perform a Redirect within Slim Framework controller __construct()

我在 Slim Framework v3 中有一个应用程序。有 2 个控制器,classes/FrontController.phpclasses/AdminController.php

AdminController.php 用于管理功能(不足为奇!),FrontController.php 用于应用程序的“public”部分。

/index.php 中定义了各种路由,运行 在这些控制器中运行 - 一切正常。

我想做的是在 AdminController::__construct() 中编写一段代码(不重复),这样它将在用户尝试访问任何内容时将其重定向到 FrontController::index()通过 URL 操作的管理员路由。

我的 AdminController 中的代码是这样的:

public function __construct(Slim\Container $ci) {
    $this->ci = $ci;
    if (!$this->_isAdmin()) {
        return $this->ci->response->withStatus(302)->withHeader('Location', '/index');
    }
}

尽管 $this->_isAdmin() return 是错误的,但它似乎没有任何作用 - 我什至通过 only [=43= 测试过它]ing false 无论数据库在正常操作下 return 的结果如何。我的期望是此时它会重定向,但如果我尝试在浏览器中访问 /admin,它会加载 AdminController::index()

我猜这与无法在构造函数中操作响应有关?我该如何处理?

有关信息,我的 index.php 中的路线是这样的:

$app->get('/', '\FrontController:index')->setName('/index');
$app->get('/admin', '\AdminController:index');
// many other routes...

您正在尝试 return 构造函数中的 Response 对象。构造函数用于构造对象,因此 return 值什么都不做,您应该为此使用中间件或在每个路由方法中进行此检查。

$app->get('/admin', '\AdminController:index')->add(function($request, $response, $next) {
    if(user is not admin) {
        return $response->withStatus(302)->withHeader('Location', '/index');
    }
    return $next($request, $response);
});