【问题标题】:How to fix infinite redirect loop?如何修复无限重定向循环?
【发布时间】:2017-10-14 07:26:09
【问题描述】:

我正在运行我自己的 MVC 结构,但遇到了一个我不知道如何解决或修复的问题。我查看了其他各种问题,例如12,以及许多其他并没有太大帮助的问题。

我在数据库中有一个返回用户信息的表,如果找不到信息,则将他们重定向到一个页面以强制他们提交数据。

我创建了一个 Authenticated 类,它扩展了控制器(包含重定向方法):

abstract class Authenticated extends \Core\Controller {

    protected function before() {
        $this->requirePersonality();
    }

    protected function requirePersonality(){
        if(!(new PlannerAuth())->getPersonality()){
            $this->redirect('/app/personalization');
        }
    }
}

在我的应用控制器中,我有:

class App extends Authenticated {

    protected function before(){
        parent::before();
    }

    public function personalizationAction(){
        View::renderTemplate('App/personalization.html');
    }
}

before() 方法将在所有操作方法之前运行,因此当我在应用程序中运行任何 url 时,会发生以下逻辑:

Authentication before() 运行,将我重定向到 /app/personalization,一旦到了那里,它就会检查当前的 before(),它会再次重新运行身份验证 before() 方法,然后继续。 . 创建一个无限循环。

我还有一个after() 方法,它将在所有方法之后运行,但这不起作用,因为它不会强制用户进入个性化页面。

这只会在我在 App 控制器中运行任何方法时发生,我可以在另一个控制器中使用 personalizationAction,但这不是我需要的。

【问题讨论】:

    标签: php redirect


    【解决方案1】:

    您不应该在 /app/personalization 控制器的 before 函数中调用 parent::before();。您可以在该类中实现requirePersonality(),但避免重定向到同一个控制器。

    【讨论】:

    • 根据您的回答,我将如何从身份验证中运行该功能?假设我有一个 requireLogin() 函数,如果用户没有登录,将他们重定向到登录页面?根据我的问题使用 this(requireLogin) 作为示例,它可以工作,因为登录将有它自己的控制器,因此重定向可以工作。
    • 没错。如果会话时间结束或用户未登录,则应将其重定向到登录页面。
    • 好的,我现在要解决个性化页面的问题。也许我会为它创建另一个控制器,如果我能管理我想要做的事情,重定向到同一个控制器,那就太好了,但我想我会管理的,谢谢。
    • 我仍然有一个问题,我需要重定向到任何控制器,这很好,但是 requirePersonality 方法在扩展到所有应用程序控制器的身份验证类中,所以我迷路了。 . 我又回到了问题上。
    • Authenticated 类只有两个函数:before 和 requirePersonality。您不会在登录控制器中调用 parent::before,因此您只需要在那里重新定义 requirePersonality 。不要让 Login 控制器扩展 Autenticated 类,而是扩展 Core/Controller 类。
    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多