Страница 1 из 3

Динамически изменить настройки модуля

Добавлено: 2015.01.16, 17:55
assd18
Здравствуйте. У меня есть модуль. Для него задаются настройки в конфигах. Когда я делаю Yii::$app->getModule они применяются. Можно ли как-то перед инициализацией модуля переопределить настройки?
Я пробовал так:
в контроллере делаю

Код: Выделить всё

Yii::$app->params['modules']['myModule']['property'] = 'testFromController';
Yii::$app->getModule('myModule');
.....
 
потом в самом модуле

Код: Выделить всё

 public function init() {
  parent::init();
   Yii::configure($this,  Yii::$app->params['modules']['myModule']);
   }
 
получаю ошибку Undefined index: modules

если сделать print_r(Yii::$app->params['modules']['myModule']) он покажет значение которое было переопределено в контроллере - testFromController.

если же переопределить свойство в функции init() - все хорошо:

Код: Выделить всё

public function init() {
  parent::init();
  Yii::$app->params['modules']['myModule']['property'] = 'testFromModule';
   Yii::configure($this,  Yii::$app->params['modules']['myModule']);
   }
 
Может это баг, я даже незнаю...

Re: Динамически изменить настройки модуля

Добавлено: 2015.01.16, 18:13
dmeroff
Зачем такие сложности? Почему не делаете, например, так:

Код: Выделить всё

\Yii::$app->getModule('myModule')->property = 'propertyValue';
 
Если же все-таки нужно непосредственно до инициализации, то переопределяйте через DI контейнер:

Код: Выделить всё

\Yii::$container->set('my\module\Classname', ['property' => 'value']);
\Yii::$app->getModule('myModule');

Re: Динамически изменить настройки модуля

Добавлено: 2015.01.16, 21:44
assd18
Если делаю так

Код: Выделить всё

\Yii::$container->set('my\module\Classname', ['property' => 'value']);
$module = \Yii::$app->getModule('myModule');
var_dump($module); die();
то все равно, значение property равняется тому, что было задано в конфигах, а не новому - 'value'

Re: Динамически изменить настройки модуля

Добавлено: 2015.01.17, 11:55
assd18
Может это из-за того, что я в контроллере модуля неправильно вызываю параметры?
я делаю так

Код: Выделить всё

$module = $this->module;
$module->property;
 

Re: Динамически изменить настройки модуля

Добавлено: 2015.01.17, 12:06
dmeroff
Да, вы правы, через DI контейнер не получится. Ну а чем вас не устраивает

Код: Выделить всё

\Yii::$app->getModule('myModule')->property = 'propertyValue';
  

Re: Динамически изменить настройки модуля

Добавлено: 2015.01.17, 12:12
assd18
Так тоже не выходит, все равно подтягивает значение из конфига, а не новое.

Код: Выделить всё

$module = \Yii::$app->getModule('myModule');
$module->property = 'property';
$module->runAction('controller\action');

Re: Динамически изменить настройки модуля

Добавлено: 2015.01.17, 12:13
lynicidn
dmeroff писал(а):Да, вы правы, через DI контейнер не получится. Ну а чем вас не устраивает

Код: Выделить всё

\Yii::$app->getModule('myModule')->property = 'propertyValue';
получится, если в конфиге не затирается

Re: Динамически изменить настройки модуля

Добавлено: 2015.01.17, 12:13
lynicidn
попробуйте ловить в конструкторе

Re: Динамически изменить настройки модуля

Добавлено: 2015.01.17, 12:14
lynicidn
переопределение (лайв) не все модули могут поддерживать, т.е. инициализацию лучше делать уже по устаканенному конфигу

Re: Динамически изменить настройки модуля

Добавлено: 2015.01.17, 13:13
assd18
lynicidn писал(а):переопределение (лайв) не все модули могут поддерживать, т.е. инициализацию лучше делать уже по устаканенному конфигу
А если в разных контроллерах я хочу подключить модуль с разными конфигами? Можно ли как-то в зависимости от контроллера подключать конфиги для модуля?

Re: Динамически изменить настройки модуля

Добавлено: 2015.01.17, 13:56
lynicidn
не получится, т.к. объект в контейнере уже будет создан и конструктор не сработает при повторном вызове, да и init тоже, разве что в ручную его вызывать, что тоже должно учитываться

Re: Динамически изменить настройки модуля

Добавлено: 2015.01.18, 00:19
assd18
Может как-то можно через canSetProperty? Только я не понимаю, в модуле нужно создать метод?

Код: Выделить всё

public function setProperty($property) {
        $this->property = $property;
    }
а потом в контроллере вызывать так

Код: Выделить всё

$module = \Yii::$app->getModule('myModule');
$module->canSetProperty('property');
$module->setProperty( 'property');
или это вообще не подходит?

Re: Динамически изменить настройки модуля

Добавлено: 2015.01.18, 01:19
lynicidn
проверьте еще раз все, у вас видимо где то банальная ошибка
>
если сделать print_r(Yii::$app->params['modules']['myModule']) он покажет значение которое было переопределено в контроллере - testFromController.

тут должно вывести массив

Re: Динамически изменить настройки модуля

Добавлено: 2015.01.18, 11:26
assd18
Смотрите, что получается, переопределяю значение в контроллере

Код: Выделить всё

Yii::$app->params['modules']['myModuleId']['property'] = 'newvalue';
$module = \Yii::$app->getModule('myModuleId');


в модуле делаю print_r

Код: Выделить всё

public function init() {
        parent::init();
        print_r($this->property); //тут будет значение 'valuefromconfig'
        print_r(Yii::$app->params['modules']['myModuleId']['property']); die(); //здесь будет 'newvalue'
    }

Re: Динамически изменить настройки модуля

Добавлено: 2015.01.18, 12:08
assd18
Получается через Yii::$app->params['modules']['myModuleId']['property'] невозможно переопределить $this->property. Можете у себя попробовать вывести так как я? Если у Вас будут одинаковые тогда точно проблема у меня.
Где Вы делали print_r(Yii::$app->params['modules']['myModule']), в init() модуля или в другом месте?

Re: Динамически изменить настройки модуля

Добавлено: 2015.01.18, 12:10
lynicidn
assd18 писал(а):Смотрите, что получается, переопределяю значение в контроллере

Код: Выделить всё

Yii::$app->params['modules']['myModuleId']['property'] = 'newvalue';
$module = \Yii::$app->getModule('myModuleId');
 


в модуле делаю print_r

Код: Выделить всё

public function init() {
        parent::init();
        print_r($this->property); //тут будет значение 'valuefromconfig'
        print_r(Yii::$app->params['modules']['myModuleId']['property']); die(); //здесь будет 'newvalue'
    }
 
это ожидаемо, что вы тут хотели другое увидить?

Re: Динамически изменить настройки модуля

Добавлено: 2015.01.18, 12:21
assd18
Да нет, просто не могу понять как обратиться к переопределенному property. Свойства использую в контроллере модуля так:

Код: Выделить всё

public function actionIndex() {
 $module = $this->module;
 $module->property;
}
как тогда можно достучаться до нового значения property ?

Re: Динамически изменить настройки модуля

Добавлено: 2015.01.18, 12:24
lynicidn
так вы его не присваеваете в коде выше

Re: Динамически изменить настройки модуля

Добавлено: 2015.01.18, 12:29
assd18
Нет это просто пример обращения. На самом деле присваиваю и работаю с этим значением. Но оно всегда равняется тому которое было задано в конфигах.

Re: Динамически изменить настройки модуля

Добавлено: 2015.01.18, 12:36
lynicidn
вы должна показывать код чтобы можно было воспроизвести ошибку