0

セッションを多用するプロジェクトに取り組んでいます。データベース ハンドラー (Zend の標準ハンドラー) があり、現在、preDispatchLoop のプラグインにこの初期化 (データベース ハンドラー + セッション開始) があります。以前は preDispatch にありましたが、アクションごとに呼び出されるため (「転送された」アクションに含まれていたため、問題が発生しました。

私の問題は、私が国際化に取り組み始めたことと、ルーターを使用して URI の言語を検出し始めたことです: フォーム /language/controller/action を使用します)。ルーターは、セッションを使用して言語を読み取り/保存しようとしています。しかし、ご存じかもしれませんが、ルーターが最初に来て、次に (事前/事後) ディスパッチャーが来ます。

したがって、問題は次のとおりです。セッションの初期化をブートストラップに移動しないのはなぜですか? 以前はそこにあったためですが、エラーを防ぐために db (セッションが db を使用することを思い出してください) にアクセスできることをテストする必要があるため、移動する必要がありました。エラーが発生した場合は、単にリダイレクトします (request->setController/setAction エラー)。セッション初期化コードをブートストラップに戻すと、データベースにアクセスできない場合、リダイレクトを行うことができません。

他の質問を読みましたが、多くの人がブートストラップからリクエスト オブジェクトにアクセスすることを求めていることがわかりました。しかし、彼らは皆、「できるがすべきではない」と言っています。しかし、この場合はどうすればいいですか?私の最後のオプションは、セッションの初期化をブートストラップに戻すことです。それが失敗した場合は、手動でヘッダーを送信してビューを読み取りますが、エラー コードですが、それは恐ろしいハックです。

私の考えでは、セッションはそれほど早く使用されるべきではありません。要求されたコントローラー/アクションをまだ完全に認識していないため、ブートストラップで呼び出すべきではありません。言語を取得するには、単に Cookie (手動) に依存し、そこから (および URI から) 取得できると思います。そして、いつかセッション情報をブートストラップで使用する必要がある場合は、グローバル変数を使用します。

どう思いますか ?アプリケーションの制御方法にエラーがありますか?

見られるいくつかの質問:

Zend Framework: ブートストラップでリクエスト オブジェクトを取得する

Zend Framework でセッション処理を処理する最良の方法

(Zend バージョン 1.9.6、アプリケーションもブートストラップも使用しない)

4

1 に答える 1

1

セッションの初期化とデータベース接続をブートストラップに移動します。
ブートストラップ中にデータベースに接続できない場合、これは低レベルのエラーとしてカウントされます。本番環境で発生することは例外ではありません。
ブートストラップ プロセスを try catch ブロックにラップするだけで、エラー ページを出力できます。

// in your index.php
try {
    $application = new Zend_Application(
        APPLICATION_ENV,
        APPLICATION_PATH . '/configs/application.ini'
    );

    $application->bootstrap()
                ->run();

} catch (Exception $e) {
    header('Content-type: text/html; charset=utf-8');
    header('HTTP/1.1 503 Service Unavailable');
    header("Retry-After: 3600");
    // Output some error page.
    echo "<html><head><title>System Error</title></head><body>...</bod></html>";
?>
于 2010-07-26T07:41:33.007 に答える