太多重定向PHP MVC

时间:2018-02-25 19:36:44

标签: php redirect http-headers

stderr

}

我正在学习如何为PHP创建自己的MVC框架。我试图在核心类中重定向用户,该核心类基于url实例化控制器。

class Core { protected $currentController = ''; protected $currentMethod = ''; protected $params = []; public function __construct() { $url = $this->getUrl(); $pages = [ "" => ["controller" => "Pages", "method" => "index"], "profile" => ["controller" => "Pages", "method" => "profile"], "help" => ["controller" => "Pages", "method" => "help"], "signin" => ["controller" => "Pages", "method" => "signin"] ]; // cant access controller $noaccess = ["pages"]; if (in_array($url[0], $noaccess)) { redirect("/"); } if (isLoggedIn()) { if (!in_array($url[0], $noaccess)) { if (!array_key_exists($url[0], $pages)) { if (file_exists('../app/controllers/' . ucwords($url[0]) . '.php')) { // If exists, set as controller $this->currentController = ucwords($url[0]); $this->currentMethod = "index"; // Unset 0 Index unset($url[0]); } else { // 404 $this->currentController = "Pages"; $this->currentMethod = "error404"; unset($url[0]); } } else { foreach ($pages as $page => $options) { if ($url[0] == $page) { $this->currentController = $options['controller']; $this->currentMethod = $options['method']; //unset($url[0]); } } } } } else { redirect("signin"); } // Require the controller require_once '../app/controllers/' . $this->currentController . '.php'; // Instantiate controller class $this->currentController = new $this->currentController; // Check for second part of url if (isset($url[1])) { // Check to see if method exists in controller if (method_exists($this->currentController, $url[1])) { $this->currentMethod = $url[1]; // Unset 1 index unset($url[1]); } } // Get params $this->params = $url ? array_values($url) : []; // Call a callback with array of params call_user_func_array([$this->currentController, $this->currentMethod], $this->params); } public function getUrl() { if (isset($_GET['url'])) { $url = rtrim($_GET['url'], '/'); $url = filter_var($url, FILTER_SANITIZE_URL); $url = explode('/', $url); return $url; } } 将实例化后置控制器。

如果他们未登录,我想将其重定向到example.com/posts/。如果用户未登录,则无法访问任何页面。

我有一个名为/signin/的基本函数,用于检查isLoggedIn()变量。我能够测试它是否适用于$_SESSION命令。

一切正常,但我收到的错误是说有太多的重定向。我对die()的重定向工作没有这个问题,但我无法使用一个登录的工作。我不确定为什么会遇到这个问题。

1 个答案:

答案 0 :(得分:0)

如果每个页面都创建了一个新的Core对象,包括登录页面,那么无论何时尝试登录(访问登录页面),它都会在永无止境的循环中继续重定向到自身。

添加条件或者根本不检查构造函数中的登录数据应该可以解决问题。有很多方法可以做到,但这是一般的想法。

最后,除了登录页面之外,所有页面都运行相同的逻辑,这会使其反转。