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の評判を提供することに意味がありません。