Я использую Zend_Application, и он не чувствует себя хорошо, что я смешиваю в своем application.ini и приложение и пользовательскую конфигурацию.
То, что я имею в виду с этим, следующее. Например, для моего приложения нужны некоторые классы библиотеки в пространстве имен MyApp_. Таким образом в application.ini я поместил autoloaderNamespaces [] = "MyApp _". Это - чистая конфигурация приложения, никто кроме программиста не изменил бы их. С другой стороны, я поместил там конфигурацию базы данных, что-то, что изменит SysAdmin.
Моя идея состоит в том, что я разделил бы опции между application.ini и user.ini, где опции в user.ini берут предпочтение (таким образом, я могу определить стандартные значения в application.ini).
Действительно ли это - хорошая идея? Как я могу лучше всего реализовать это? Идея, которую я имею,
Что я сделаю? Я хотел бы иметь 'самое чистое' решение, которое подготовлено к будущему (более новые версии ZF и другие разработчики, работающие над тем же приложением)
Я нашел решение этой проблемы, который может быть новым для Framework версии 1.10. При создании объекта Application Application вы можете пройти в 2 пути конфигурации файлов в массиве параметров, которые объединяются вместе:
$application = new Zend_Application(
APPLICATION_ENV,
array(
'config' => array(
APPLICATION_PATH . '/configs/application.ini',
APPLICATION_PATH . '/configs/user.ini'
),
)
);
Вы можете обеспечить метод Bootstrap _initConfig (), призывающую перед другими, указав в других методах Bootstrap (которые требуют объекта 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' )
Метод. Я использую реестр, так что Config можно легко получить доступ к другим частям моего приложения.
В аналогичном сценарии я видел, что конкретные параметры приложений могут быть предусмотрены программно при создании приложения. Это помогло разместить параметры, связанные с конфигурацией в пределах 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);
}
}
внутри бутстрапа
Нет ничего плохого в этом, я делаю что-то подобное. Я предлагаю использовать ваш второй выбор. У меня просто есть метод _initConfig (), который заботится о загрузке пользовательского конфигурации с помощью zend_config_ini. Я бы не продлил 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');
/* ... */
}
нет необходимости использовать Zend_registry что-нибудь возвращено методом Bootstrap _init, доступно с использованием GetResource ()
Файл конфигурации может иметь элемент «Config», который относится к другому файлу конфигурации. Zend_Application будет включать в себя этот файл конфигурации. Включенный конфигурационный файл будет иметь предпочтение и перезаписать ключевые ключи, уже определенные в стандартном файле конфигурации.
Вчера была также запущена нить на списке Zend Framework Meading Mex
Примеры
Application.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"
Public / index.php:
$application = new Zend_Application(
APPLICATION_ENV,
APPLICATION_PATH . '/configs/application.ini'
);
вы знаете, что это объединит столько inis, сколько вы хотите?
в application.ini
[production]
config[] = APPLICATION_PATH "/configs/dsn.ini"
config[] = APPLICATION_PATH "/configs/error.ini"
...