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

时间:2017-01-09 16:27:23

标签: php slim

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

AdminController.php用于管理员功能(毫不奇怪!)和FrontController.php用于应用程序的“公共”部分。

/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()返回false,这似乎也没有做任何事情 - 我甚至只通过 返回false来测试它,而不管数据库在正常操作下返回的结果如何。我的期望是它会在此时重定向,但如果我尝试在浏览器中访问AdminController::index(),它会加载/admin

我猜这与响应无法在构造函数中操作这一事实有关?但我现在迷路了,不知道如何处理这件事。任何建议表示赞赏。

有关信息,index.php中的路线如下:

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

1 个答案:

答案 0 :(得分:2)

您正在尝试在构造函数中返回Response对象。构造函数用于构造对象,因此返回值不执行任何操作,您应该使用中间件或者在每个路由方法中进行检查。

$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);
});