2

次の URL フォームを使用してサイトを設計しています:
example.com/controller/action/locale
uri パラメータ locale からロケールを取得します。

ブートストラップで、Zend_Locale、Zend_Translator、またはコンポーネントのように Zend_Validate_Date を構成するその他のリソースなどのリソースを初期化したい場合、それらはすべてロケール データを必要とします。さらに、受け取ったロケールに応じて異なるデータベースを使用することもできました。しかし、通常、ブートストラップでは uri パラメーターを使用できないため、コントローラー プラグインで上記のすべてを初期化する必要がありますが、これは私には無意味に思えます。

結論として、リクエスト オブジェクトと uri パラメータはブートストラップで利用できるはずだったと思います。したがって、Zend Framework の現在の設計には、この点が欠けています。

私は正しいですか、何か不足していますか?

4

2 に答える 2

2

申し訳ありませんが、あなたが提案していることは悪い考えです。ブートストラップは、必要な設定、変数などを初期化することによって、ライブラリを動作状態にすることを目的としています。

ブートストラッパーがすべきこと:

  • 「include_path」にカスタム パスを追加します
  • 文字セット (UTF-8) とエンコード ディレクティブ (mb_internal_encoding) を初期化します。
  • ロガーの初期化 (エラーまたはアプリのログ記録)
  • オートローダーの初期化

アプリケーションは、コントローラー層で要件を処理する必要があります。たとえば、ユーザーが example.com/controller/action/en-US にアクセスした場合、コントローラーはリクエスト オブジェクト (および指定されたパラメーター) にアクセスすることでそれに応じて言語を設定し、現在および後続のページを英語で表示するようにユーザー セッション変数を設定できます。 .

- 編集 -

中間クラスを使用して i18n/ロケール設定を初期化するための実装例と、値をブートストラップに渡すための実装例:

// Controller

$i18n = new i18n();

$i18n->setLocale($this->getRequest()->getParameter('locale'));

// Now I can make locale specific calls to validate localized data
$i18n->validateDate($this->getRequest()->getParameter('date'));

// Can also make queries for locale specific data
$results = $i18n->getDob()->query('select * from my_table');

// i18n class
class i18n
{
    protected $locale;

    public function setLocale($locale)
    {
        $this->locale = $locale;
    }

    public function getLocale()
    {
        return $this->locale;
    }

    // Factory method for creating a database object based on locale
    public function getDbo()
    {
        switch ($this->getLocale()) {

            case 'en-US':
                return new Zend_Db::factory('Pdo_Mysql', array(
                    'host' => 'hostname',
                    'username' => 'username',
                    'password' => 'password',
                    'dbname' => 'en_us_locale'
                ));

            case 'en-GB':
                return new Zend_Db::factory('Pdo_Mysql', array(
                    'host' => 'hostname',
                    'username' => 'username',
                    'password' => 'password',
                    'dbname' => 'en_gb_locale'
                ));
        }
    }
}
于 2012-01-20T22:02:13.600 に答える
1

あなたがする必要があるのは、私が思うカスタムプラグインを書くことです。

プラグインに慣れるために、このリンクを確認することから始めます:http: //framework.zend.com/manual/en/zend.controller.plugins.html

次に、これを覗いてみてください(これはあなたが望むものの一部のようです): http: //framework.zend.com/manual/en/zend.application.available-resources.html#zend.application.available-resources。ロケール

最後に、独自のプラグインを作成する場合、重要なのは

$ request-> getParam();
(おそらくあなたがしていることのための)preDispatch関数の変数

以下は、リクエストのモジュールに基づいてレイアウトファイルを切り替える小さな男です-うまくいけば、それはあなたにいくつかの洞察を与えるでしょう。

<?php
    /*
 *  Theme Switcher 
 *  Set the current module name as $this->skin in the layout
 *  
 *  
 */
class My_Controller_Plugin_Themer extends Zend_Controller_Plugin_Abstract
{
    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        $module_name    = $request->getModuleName();
        $view       = Zend_Layout::getMvcInstance()->getView();
        $view->skin     = $module_name;
    }
}?>
于 2012-01-20T22:15:00.443 に答える