5

Zend_Application を使用していますが、application.ini にアプリケーションとユーザー構成の両方を混在させているのは正しくありません。

これで私が意味することは次のとおりです。たとえば、私のアプリケーションでは、名前空間 MyApp_ にいくつかのライブラリ クラスが必要です。そのため、application.ini に autoloaderNamespaces[] = "MyApp_" を配置しました。これは純粋なアプリケーション構成であり、プログラマー以外の誰もこれらを変更することはありません。一方、システム管理者が変更するデータベース構成をそこに置きました。

私の考えでは、application.ini と user.ini の間でオプションを分割し、user.ini のオプションが優先されます (したがって、application.ini で標準値を定義できます)。

これは良い考えですか?どうすればこれを最もよく実装できますか? 私が持っているアイデアは

  • Zend_Application を拡張して複数の構成ファイルを取得する
  • ブートストラップで init 関数を作成して user.ini をロードする
  • index.php の構成ファイルを解析し、これらを Zend_Application に渡します (醜いように聞こえます)。

何をすればよいでしょうか?将来に向けて準備された「最もクリーンな」ソリューションが必要です (新しい ZF バージョン、および同じアプリで作業している他の開発者)

4

6 に答える 6

10

この問題の解決策を見つけました。これは、フレームワークバージョン1.10では新しい可能性があります。Zend Applicationオブジェクトを作成するときに、一緒にマージされるオプション配列の2つの構成ファイルパスを渡すことができます。

$application = new Zend_Application(
    APPLICATION_ENV,
    array(
        'config' => array(
            APPLICATION_PATH . '/configs/application.ini',
            APPLICATION_PATH . '/configs/user.ini'
        ),
    )
);
于 2010-02-01T14:17:23.933 に答える
6

これにより、必要なだけ inis がマージされることを知っていますか?

application.ini で

[production]
config[] = APPLICATION_PATH "/configs/dsn.ini"
config[] = APPLICATION_PATH "/configs/error.ini"
...
于 2010-05-27T21:29:11.673 に答える
5

それは何も悪いことではありません、私は似たようなことをします。2番目の選択肢を使用することをお勧めします。Zend_Config_Ini を使用してユーザー構成をロードする _initConfig() メソッドがあります。Zend_App を拡張するつもりはありません。

編集:

コメントに応じて、次のようにします。

$this->bootstrap('config');

したがって、設定が DB の前に読み込まれるようにするには、次のようにします。

protected function _initConfig()
{
    $config = new Zend_Config_Ini('/path/to/user.ini');
    return $config;
}

protected function _initDb()
{
    $this->bootstrap('config');
    $config = $this->getResource('Config');

    /* ... */
}

Bootstrap _init メソッドによって返されるものはすべて getResource() を使用してアクセスできるため、Zend_Registry を使用する必要はありません。

于 2010-01-10T12:06:19.330 に答える
1

構成ファイルには、別の構成ファイルを参照する項目「config」を含めることができます。Zend_Application には、この構成ファイルが含まれます。含まれている構成ファイルが優先され、標準の構成ファイルで既に定義されているキーが上書きされます。

昨日、 Zend Framework メーリング リストでもスレッドが開始されました。

アプリケーション.ini:

[production]
config = APPLICATION_PATH "/configs/config.ini"
resources.db.adapter = "Mysqli"
resources.db.host = "localhost"

config.ini:

[production]
resources.db.host = "mysql.server.com"
resources.db.username = "myuser"

公開/index.php:

$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);
于 2010-01-12T19:52:44.043 に答える
0

同様のシナリオで、アプリケーションをインスタンス化するときに、アプリケーション固有のパラメーターをプログラムで提供できることを確認しました。これは、config.ini 内に構成関連のパラメーターを配置するのに役立ちました。

私は実際にこのようにしました:

index.php 内でアプリケーションを起動します

     $application = new Zend_Application(APPLICATION_ENV, array(
                'resources' => array(
                   'FrontController' => array(
                       'controllerDirectory' => APPLICATION_PATH . '/main/controllers',
                    ),
                'layout' => array(
                    'layoutpath' => APPLICATION_PATH . "/layouts/scripts"
                    ),
                ),
            ));

and then inside the bootstrap parse the config.ini inidependently

    protected function _initConfigFile() {
        try {
            $configuration = new Zend_Config_Ini(
                APPLICATION_PATH . '/config/app.ini',
                APPLICATION_ENV );
            $registry->configuration = $configuration;
        } catch (Zend_Exception $zExp) {
            echo "Could not read application ini file (app.ini). "
                . " Please check that it exists and has the appropriate structure.\n";
            echo("\n");
            var_dump($zExp);
            exit(1);
        }
    }

ブートストラップの内部

于 2010-01-11T22:46:35.923 に答える
-1

_initConfig() ブートストラップ メソッドが他のブートストラップ メソッド (config オブジェクトを必要とする) で次のように指定することで、他のメソッドよりも先に呼び出されるようにすることができます。

$this->bootstrap('config');

より完全な例 (Bootstrap クラスのコンテキスト):

protected function _initConfig() {
    $config = new Zend_Config_Ini('[filename]');
    Zend_Registry::set('config',$config);
}

protected function _initSomething() {
    $this->bootstrap('config');
    $config = Zend_Registry::get('config');
    // you can now do whatever you like with the $config object
}

アップデート:

他の回答で述べたように、構成がブートストラップ内でのみ必要な場合は、$this->getResource('Config')メソッドを使用することをお勧めします。アプリケーションの他の部分で構成に簡単にアクセスできるように、レジストリを使用します。

于 2010-01-10T17:04:26.920 に答える