2

そのアプリのインスタンス内のパラメーターZend_Applicationを使用して、インスタンスに埋め込みたい共通の機能セットがあります。ただし、スレーブ構成ファイルは、それ自体に相対的なパス内のものを参照できるようにしたいと考えています。例えば:configsZend_Config

$ / application / configs / application.ini:

[base]
config[] = APPLICATION_PATH "../CasCommon/Configs/common.ini

$ / CasCommon / Configs / common.ini

[base]
resources.frontController.controllerDirectory[] = PATH_TO_THIS_IN_DIR "../Controllers"
resources.frontController.actionHelperPaths.Cas_Common_Helper = PATH_TO_THIS_IN_DIR "../ControllerHelpers"
;...

どうすればそのようなことを成し遂げることができるでしょうか?

4

2 に答える 2

3

PHPはIniファイルの定数をサポートしていますが、残念ながら魔法の定数はサポートしていないため、を使用することはできません__DIR__。これにより、問題が解決します。最も簡単で明白なことは、application.iniファイルへのパスをAPPLICATION_PATH、たとえばの場合と同じように定数として定義することです。

// application.ini
foo = INI_PATH '/../somewhere/else'

// index.php
const INI_PATH = '/path/to/config/folder';

Zend_Application次に、定期的にロードするか、新しいものをインスタンス化するだけZend_Configで、定数が希望どおりに評価されます。

コメント後に編集

私は、上記についてのその議論は、自動魔法では十分に議論の余地がないことに気づきました。標準のZFプロジェクトでは、APPLICATION_PATHはindex.phpファイルで定義されており、デフォルトのapplication.iniがロードされる場所でもあります。あなたがしなければならないのはそこに定数を追加することです。とにかくIniファイルはそれ自体では存在しないため、誰かがいつか外部ライブラリを呼び出す必要があります(開発者としてのあなたのようです)。上記のソリューションには、1行のセットアップが必要です。他のソリューションには、より多くの作業が必要です。

それだけでは不十分な場合はZend_Application、application.iniがロードされる前に、その定数を自動的に追加するように拡張できます。

class My_Zend_Application extends Zend_Application
{
    protected function _loadConfig($file)
    {
        if (!defined('PATH_TO_INI')) {
            define('PATH_TO_INI', dirname(realpath($file)));
        }
        return parent::_loadConfig($file);
    }
}

もちろん、拡張を使用するにはindex.phpを変更するMy_Zend_Application必要があります。そのため、index.phpファイルに定数を追加することもできるので、このアプローチは無意味だと思います。

Zend_Applicationもちろん、実行時に定数を変更することはできなくなるため、カスタムではapplication.iniに制限されます。したがって、application.iniだけでなく、複数のIniファイルに対してこの機能が必要な場合Zend_Config_Iniは、相対パスマーカーの各値を拡張して確認してから、返されます。

class My_Config_Ini extends Zend_Config_Ini
{
    protected $_relativePath;
    protected $_relativePathMarker = '%REL_PATH%';
    public function __construct($filename, $section = null, $options = false)
    {
        $this->_relativePath = dirname(realpath($filename));
        parent::__construct($filename, $section, $options);
    }
    public function get($name, $default = null)
    {
        if (array_key_exists($name, $this->_data)) {
            return $this->_containsRelativePathMarker($this->_data[$name])
                ? $this->_expandRelativePath($this->_data[$name])
                : $this->_data[$name];
        }
        return $default;
    }
    protected function _containsRelativePathMarker($value)
    {
        return strpos($value, $this->_relativePathMarker) !== FALSE;
    }
    protected function _expandRelativePath($value)
    {
        return str_replace('%REL_PATH%', $this->_relativePath, $value);
    }
}

上記は、Iniファイルを次のようなもので書き込むことを前提としています。

foo = %REL_PATH% '/../foo.txt'

それでもそれがあなたが探しているものではない場合、私はあなたにもう一度正確な要件を提示するように勧めることができます。私たちがあなたの心を読むことができなかったので、あなたがここでどんな答えも受け入れないつもりであるとき、500の評判を提供することに意味がありません。

于 2011-11-28T17:06:36.437 に答える
2

別のオプションは(オプションがallowModificationstrueに設定されている場合)、作業ディレクトリを変更してから、フォルダをリアルパスすることです。または、ファイルのロード後にパスを先頭に追加することもできます。

$config = new Zend_Config_Ini('config.ini', 'section', array(
    'allowModifications' => true,
));
$dir = getcwd();
chdir('..');
$config->path = realpath($config->path);
chdir($dir);
于 2011-12-12T09:53:54.987 に答える