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 не будет существовать сам по себе, поэтому кто-то должен будет вызвать внешнюю библиотеку в какой-то момент (вероятно, вы как разработчик). Приведенное выше решение требует одну строку настройки. Любое другое решение требует больше работы.
Если этого недостаточно для вас, вы можете расширить 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, потому что вы не можете больше изменять константу во время выполнения. Поэтому, если вам нужна эта функциональность для нескольких файлов Ini, а не только для application.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 репутации, если вы не собираетесь принимать какие-либо ответы здесь, потому что мы не прочитали ваши мысли.