ウェブサイトのメンテナンスリダイレクトページを作成しようとしています。これにより、「メンテナンス/更新モード」を有効にできます。これにより、すべてのページリクエストが「メンテナンスページのダウン」にリダイレクトされます。Configure :: write()を使用して書き込まれ、Configure :: read()を使用してチェックするグローバル変数にスイッチを設定しました。
私が抱えている問題は、オフラインモードの場合、すべてのページリクエストをリダイレクトするにはどうすればよいですか?私が最初に考えたのは、AppControllerのbeforeFilter()関数の条件付き$ this-> redirect(...)でした。ただし、これにより「リダイレクトループ」エラーが発生しました。
私の2番目の考えは、おそらく(CakePHPは初めてですが)これが頻繁に呼び出され、基本クラスのControllerの最初のフィルターであるため、このアイデアはばかげているということでした。リダイレクトのオンラインまたはオフラインのステータスについて同じ変数をチェックする「MaintenanceFilter」を作成することで、これを修正できると思いました。ただし、CookBookにはCake 2.2の新機能であるフィルターが記載されており、このWebサイトでは2.1を使用しています。フィルタは、優先度1(app / Routing / Filterで定義)を指定しても機能しないように見えます。
App::uses('DispatcherFilter', 'Routing');
class MaintenanceFilter extends DispatcherFilter
{
public function beforeDispatch(CakeEvent $event)
{
if (strcmp(Configure::read('ServerStatus'), 'online') == 0)
{
$event->stopPropagation();
$dispatcher = new Dispatcher();
$dispatcher->dispatch(array('controller' => 'errors',
'action' => 'maintenance'));
}
}
}
次に、これをもっと一般的に行うことができ、Router :: connect('*'、...)を使用してルーティング条件を設定すると、すべてのページが/ Errors/maintenanceにリダイレクトされると思いました。条件付きサーバーステータスチェックは次のとおりです。 :
Router::connect('*', array('controller' => 'Errors',
'action' => 'maintenance'));
これをルーティングファイルの先頭に配置して、最初に処理されるようにしました。ご想像のとおり、メンテナンスページにリダイレクトされるページはありません。
サーバーが「オフラインモード」のときにカスタム例外ハンドラーを作成して例外をスローできると思っていましたが、ハンドラーのメソッド本体内からメンテナンスページにリダイレクトするにはどうすればよいですか?
Cake 2.1に固有の何か、または一般的なCake/MVCだけが欠けているに違いありません。誰かがそれが何であるかわかりますか?