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

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
assd18
Сообщения: 69
Зарегистрирован: 2013.01.11, 16:11

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

Сообщение 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']);
   }
 
Может это баг, я даже незнаю...
dmeroff
Сообщения: 101
Зарегистрирован: 2012.06.05, 14:32
Откуда: Петрозаводск
Контактная информация:

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

Сообщение dmeroff »

Зачем такие сложности? Почему не делаете, например, так:

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

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

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

\Yii::$container->set('my\module\Classname', ['property' => 'value']);
\Yii::$app->getModule('myModule');
assd18
Сообщения: 69
Зарегистрирован: 2013.01.11, 16:11

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

Сообщение assd18 »

Если делаю так

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

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

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

Сообщение assd18 »

Может это из-за того, что я в контроллере модуля неправильно вызываю параметры?
я делаю так

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

$module = $this->module;
$module->property;
 
dmeroff
Сообщения: 101
Зарегистрирован: 2012.06.05, 14:32
Откуда: Петрозаводск
Контактная информация:

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

Сообщение dmeroff »

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

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

\Yii::$app->getModule('myModule')->property = 'propertyValue';
  
assd18
Сообщения: 69
Зарегистрирован: 2013.01.11, 16:11

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

Сообщение assd18 »

Так тоже не выходит, все равно подтягивает значение из конфига, а не новое.

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

$module = \Yii::$app->getModule('myModule');
$module->property = 'property';
$module->runAction('controller\action');
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

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

Сообщение lynicidn »

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

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

\Yii::$app->getModule('myModule')->property = 'propertyValue';
получится, если в конфиге не затирается
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

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

Сообщение lynicidn »

попробуйте ловить в конструкторе
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

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

Сообщение lynicidn »

переопределение (лайв) не все модули могут поддерживать, т.е. инициализацию лучше делать уже по устаканенному конфигу
assd18
Сообщения: 69
Зарегистрирован: 2013.01.11, 16:11

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

Сообщение assd18 »

lynicidn писал(а):переопределение (лайв) не все модули могут поддерживать, т.е. инициализацию лучше делать уже по устаканенному конфигу
А если в разных контроллерах я хочу подключить модуль с разными конфигами? Можно ли как-то в зависимости от контроллера подключать конфиги для модуля?
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

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

Сообщение lynicidn »

не получится, т.к. объект в контейнере уже будет создан и конструктор не сработает при повторном вызове, да и init тоже, разве что в ручную его вызывать, что тоже должно учитываться
assd18
Сообщения: 69
Зарегистрирован: 2013.01.11, 16:11

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

Сообщение assd18 »

Может как-то можно через canSetProperty? Только я не понимаю, в модуле нужно создать метод?

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

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

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

$module = \Yii::$app->getModule('myModule');
$module->canSetProperty('property');
$module->setProperty( 'property');
или это вообще не подходит?
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

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

Сообщение lynicidn »

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

тут должно вывести массив
assd18
Сообщения: 69
Зарегистрирован: 2013.01.11, 16:11

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

Сообщение 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'
    }
assd18
Сообщения: 69
Зарегистрирован: 2013.01.11, 16:11

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

Сообщение assd18 »

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

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

Сообщение 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'
    }
 
это ожидаемо, что вы тут хотели другое увидить?
assd18
Сообщения: 69
Зарегистрирован: 2013.01.11, 16:11

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

Сообщение assd18 »

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

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

public function actionIndex() {
 $module = $this->module;
 $module->property;
}
как тогда можно достучаться до нового значения property ?
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

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

Сообщение lynicidn »

так вы его не присваеваете в коде выше
assd18
Сообщения: 69
Зарегистрирован: 2013.01.11, 16:11

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

Сообщение assd18 »

Нет это просто пример обращения. На самом деле присваиваю и работаю с этим значением. Но оно всегда равняется тому которое было задано в конфигах.
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

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

Сообщение lynicidn »

вы должна показывать код чтобы можно было воспроизвести ошибку
Ответить