これは私の最初の 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 フォームを送信するときのブラウザの [戻る] ボタンです。記事のリストを表示し、ページネーション、一括アクション、「タイトル/カテゴリによる記事の検索」などを許可する管理ページを作成しようとしています.
この (最も役立つ) Web サイトで読んだことから、ブラウザの [戻る] ボタンがフォームを再送信しないようにする 2 つの解決策が存在します。
解決策 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>
=> article-category などの多くのパラメーターが存在する可能性があるため、最善の方法ではありません。
解決策 2. パラメータを渡さず、代わりに呼び出されたメソッドで $_POST データを使用します。すべてを $_SESSION に保存してから、header() を使用して同じクラスの別の表示メソッドにリダイレクトします。表示関数で $_SESSION からすべてを抽出し、ビューを生成します。
=>セッションに保存してから抽出する必要がある多くのパラメーターが存在する可能性があるため、最良の方法ではありません。
フロントコントローラーを使用しているときに、ブラウザーの戻るボタンがフォームを再送信するのを防ぐよりエレガントな方法はありますか? フロントコントローラーパターンを使用する場合、特に一部の一括アクションがDBの変更を必要とし、タイプが「非公開」である場合、 $_GET はあまり役に立たない可能性があるためです。
私の無知を無視して助けてください!
ありがとう