这是我的第一个 PhP-MySQL 项目,也是我的第一个(曾经)问题。我正在尝试制作一个小型门户网站,并且为了学习基础知识,我正在尝试使用前端控制器模式,因为我目前对使用观察者模式没有信心。
前端控制器基本上如下所示,并调用正确类的适当方法:
$controller =''; $action =''; $queryString ='';
parseURL($controller, $action, $queryString);
$objView = new View;
if ($controller == 'adminlogin' && $action == 'authenticate') {
AdminLogin::getInstance()->authenticate();
} else if ($controller && $action) {
SessionFactory::getSession();
if (isset($_SESSION['userName'])) { // and some more validations
callHook($controller, $action, $queryString);
} else {
$objView->assign('message', SESSION_INVALID);
$objView->display('index');
}
} else {
$objView->display('index');
}
视图也很简单:
public function assign ($variable, $value)
{
$this->passArray[$variable] = $value;
}
public function display ($view)
{
$mapper = ViewmapSingleton::getinstance();
if (1 == preg_match("/\/|\.|\\\\/", $view)) {
echo 'View name should not contain . / or \ ';
}
$template = $mapper->getViewPath($view);
if (!$template || is_dir($template)) {
echo 'The requested view file does not exist';
} else {
extract ($this->passArray);
include_once($template);
}
}
我的问题是提交 $_POST 表单时浏览器的 BACK 按钮。我正在尝试制作一个显示文章列表并允许分页、批量操作和“按标题/类别搜索文章”等的管理页面。
根据我在这个(最有用的)网站上阅读的内容,有两种解决方案可以防止浏览器的后退按钮重新提交表单:
解决方案 1. 通过使用“搜索”按钮上的 Javascript 将搜索参数附加到 URL,将搜索参数传递给操作(方法)。
<input id="btn1" type="submit" onclick="SubmitForm('index.php? controller=articles&action=showList&articleTitle='+document.getElementById('articleTitle').value)" value="Search" name="btn1"></input>
=> 不是最好的方法,因为可能有很多参数,比如文章类别等。
解决方案 2. 不要传递参数,而是在被调用的方法中使用 $_POST 数据。将所有内容保存在 $_SESSION 中,然后使用 header() 重定向到同一类中的单独显示方法。在 display 函数中从 $_SESSION 中提取所有内容并生成视图。
=>不是最好的方法,因为可能有很多参数必须存储在 Session 中然后提取。
使用前端控制器时,是否有更优雅的方法来防止浏览器的后退按钮重新提交表单?我问是因为在使用前端控制器模式时,$_GET 可能没有多大用处,尤其是在某些批量操作需要更改数据库并且属于“取消发布”类型的情况下。
请忽略我的无知和帮助!
谢谢