我在Slim Framework v3中有一个应用程序。有2个控制器classes/FrontController.php
和classes/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...
答案 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);
});