Как указать путь к файлу относительно расположения файла конфигурации, когда используется Zend_Config_Ini? - PullRequest
2 голосов
/ 28 ноября 2011

У меня есть общий набор функций, которые я хотел бы встроить в экземпляр Zend_Application, используя параметр configs внутри экземпляра Zend_Config этого приложения. Однако ведомый файл конфигурации хотел бы иметь возможность ссылаться на вещи в пути относительно себя. Например:

$ / приложение / конфиги / 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"
;...

Как можно сделать такую ​​вещь?

Ответы [ 2 ]

3 голосов
/ 28 ноября 2011

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 репутации, если вы не собираетесь принимать какие-либо ответы здесь, потому что мы не прочитали ваши мысли.

2 голосов
/ 12 декабря 2011

Другой вариант (если для параметра allowModifications установлено значение true), это изменить рабочий каталог, а затем указать путь к папке. Или даже добавьте путь после загрузки файла.

$config = new Zend_Config_Ini('config.ini', 'section', array(
    'allowModifications' => true,
));
$dir = getcwd();
chdir('..');
$config->path = realpath($config->path);
chdir($dir);
...