2

にリクエストオブジェクトを取得する:私は、uriパラメータのロケールからロケールを取得
れる
example.com/controller/action/locale。Zend Frameworkの - 私は、次のURL形式でサイトを設計していますブートストラップ

Zend_Locale、Zend_Translator、またはZend_Validate_Dateをコンポーネントのように設定する他のリソースのようなリソースを初期化したい場合は、すべてにロケールデータが必要です。 また、受け取ったロケールに応じて異なるデータベースを使用したかったかもしれません。 しかし、通常はブートストラップでuriパラメータが利用できないので、コントローラのプラグインで上記のすべてを初期化する必要があります。

結論として、私は、リクエストオブジェクトと思うので、uriパラメータはブートストラップで利用可能であったはずです。 Zend Frameworkの現在のデザインにはこの点がありません。

私は右か何かを紛失していますか?

答えて

2

申し訳ありませんが、あなたが示唆していることは悪い考えです。ブートストラップは、ブートストラッパがすべきいくつかのもの

など、変数を必要な設定を初期化することによって、作業状態にライブラリを取得するためのものです:

  • は「include_pathに」
  • にカスタムパスを追加します(文字セットを初期化しますUTF-8)及び符号化指示(mb_internal_encoding)
  • 初期ロガー(エラーまたはアプリロギング)
  • 初期オートローダ

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

- - 編集ブートストラップする通過値対仲介クラスを使用して国際化/ロケール設定を初期化するための

実装例:

// 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' 
       )); 
     } 
    } 
} 
+0

大丈夫ですが、パス、データベースなどのような私のリソースのいくつかの設定があればどうなりますか?ロケールパラメータに応じて変更されます。私はブートストラップでそれらを初期化することができません。コントローラのプラグインですべてを初期化する必要がありますか?私はこれが良いアイデアだとは思わない? –

+0

より高いレベルのブートストラップクラスを作成することができます。要求オブジェクトを渡し、現在の値に基づいてインクルードパスとデータベース接続を初期化します。ここでのゲームの終了は、基本レベルのブートストラップに要求レベルのデータを渡すのではなく、できるだけダムにしてライブラリを初期化するだけです。 –

+0

はい、これは良い解決策になるかもしれません。コントローラプラグインをブートストラップとして作成し、ブートストラップリソースを変更または初期化します。 –

1

あなたがする必要がどのようにカスタムプラグインIを書きです思う。

私は、プラグインに慣れるために、このリンクを見て開始します: 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.locale

そして最後にあなた自身のプラグインを作成している場合は、鍵は(おそらくあなたがやっていることのために)

$request->getParam();
変数を使用していますpreDispatch function

以下は、私のレイアウトファイルを、 est - うまくいけば、それはあなたにいくつかの洞察を与える。

<?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; 
    } 
}?> 
+0

現在、私はロケール用のこのようなプラグインを使用しています。これにより、ロケールリソースはブートストラップで設定オプションを設定しますが、実際はコントローラプラグインで初期化されます。しかし、実際にロケールデータが必要になるまで、ロケールデータを使ってすべてのリソースを遅延ロードに再設計する必要があります。だから私はZend_Locale、Zend_Translatorを遅延実装して実際の初期化を行い、Zend Frameworkの設計が貧弱だと思います –

関連する問題