Я хотел бы подключиться ко второй базе данных с Yii во время выполнения. Имя базы данных будет выводиться из таблицы базы данных после входа пользователя в систему.
Я видел в учебнике, что должен сделать это:
$db2 = Yii::createComponent(array( 'class' => 'EMongoClient', 'server' => 'mongodb://127.0.0.1:27017', 'db' => $emp['database'] )); Yii::app()->setComponent('db2',$db2);
Но в моем контролере, когда я получаю доступ к Yii::app()->db2
получаем ошибку:
Свойство «CWebApplication.db2» не определено
Что я делаю не так?
Для меня работает следующее:
Yii::app()->mongodb->setActive(false); Yii::app()->mongodb->setServer('mongodb://localhost:27017'); Yii::app()->mongodb->setDb('db1'); Yii::app()->mongodb->setActive(true);
ОБНОВЛЕНО: попробуйте вместо этого экземпляр передать конфигурации:
Yii::app()->setComponent( 'db2', array( 'class' => 'EMongoClient', 'server' => 'mongodb://127.0.0.1:27017', 'db' => $emp['database'] ) );
Или вы можете создать специальный индекс для params
в конфигурациях, например:
... 'params' => array( 'db2' => null, ),
И использование Yii::app()->params['db2'] = $db2
Из этого комментария:
Моя проблема заключается не в создании компонента. Вскоре после создания, если я получаю доступ к Yii :: app () -> db2, он работает, но когда я пытаюсь получить доступ через другую модель или контроллер, я получаю ошибку
Я думаю, что вы устанавливаете этот компонент только один раз где-то, а затем отправляете последующие запросы на разные контроллеры.
Вам нужно поместить код, где-то он называется EVERYTIME, в каждом запросе. Вот как работает PHP, нет «глобального состояния приложения»,
по умолчанию Yii поставляется с protected/components/controller.php
имеет базовый контроллер для остальной части приложения.
мое предложение было бы поместить ваш код в метод init()
этого контроллера, чтобы он всегда вызывался.
Вы упомянули, что имя базы данных поступает из таблицы после входа пользователя в систему, поэтому вам нужно сохранить это значение в сеансе, в другом – иметь доступ к нему в других запросах:
<?php // After login in Yii::app()->user->setState('db_name', $db_name); // in protected/components/controller.php public function init() { if (!Yii::app()->user->isGuest) { $db2 = Yii::createComponent(array( 'class' => 'EMongoClient', 'server' => 'mongodb://127.0.0.1:27017', 'db' => Yii::app()->user->getState('db_name') )); Yii::app()->setComponent('db2',$db2); } }
Надеюсь, что это помогает, я здесь много чего делаю 🙂