太多重定向PHP MVC
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了太多重定向PHP MVC相关的知识,希望对你有一定的参考价值。
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;
}
}
}
我正在学习如何为PHP创建自己的MVC框架。我正在尝试重定向核心类中的用户,该核心类基于url实例化控制器。
example.com/posts/
将实例化后控制器。
如果他们没有登录,我想将它们重定向到/signin/
。如果用户没有登录,则无法访问任何页面。
我有一个名为isLoggedIn()
的基本函数,用于检查$_SESSION
变量。我能够测试它是否适用于die()
命令。
一切正常,但我收到一个错误,说太多的重定向。关于$noaccess
的重定向工作没有这个问题,但我无法让登录的一个工作。我不确定为什么会遇到这个问题。
答案
如果每个页面都创建一个新的Core对象,包括登录页面,那么每当您尝试登录(访问登录页面)时,它将继续以永无止境的循环重定向到自身。
添加条件或根本不检查构造函数中的登录数据应该可以解决问题。有很多方法可以做到,但这是一般的想法。
最后,除了登录页面之外,所有页面都运行相同的逻辑,这会使其反转。
另一答案
感谢Zeke:https://stackoverflow.com/users/3654197/zeke
每当我重定向到/ signin /时,也会尝试重定向导致循环。
我把条件只重定向,如果网址不是/ signin /
if ( !isLoggedIn()) {
if ($url[0] == "signin") {
$this->currentController = "Pages";
$this->currentMethod = "signin";
} else {
redirect('signin');
}
unset($url[0]);
}
以上是关于太多重定向PHP MVC的主要内容,如果未能解决你的问题,请参考以下文章