Получить модуль из модели

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
faeton
Сообщения: 88
Зарегистрирован: 2011.06.06, 01:00

Получить модуль из модели

Сообщение faeton »

Здравствуйте!

Есть модуль, в нем настройки, как получить эти настройки из всех остальных мест модуля?
Контроллеру в конструкторе передается, в передать во вьюху передал так

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

    public $_module;
    public function __construct($id, $module, $config = [])
    {
        $this->_module=&$module;
        parent::__construct($id, $module, $config);
    }
А как из модели (которая в модуле), получить модуль, точнее его настройки?

Что если в приложении дважды подключается один и тот же модуль но с разными именами (естественно) и разными настройками?
Изображение
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Получить модуль из модели

Сообщение zelenin »

faeton писал(а): Что если в приложении дважды подключается один и тот же модуль но с разными именами (естественно) и разными настройками?
правильный вопрос задали - модель ничего не должна знать о модуле. Настройки передавайте в контроллере.
nepster
Сообщения: 838
Зарегистрирован: 2013.01.02, 03:35

Re: Получить модуль из модели

Сообщение nepster »

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

правильный вопрос задали - модель ничего не должна знать о модуле. Настройки передавайте в контроллере. 
Напомните, где вы это прочитали ?


Можно создать трейт:

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

trait ModuleTrait
{
    private $_module;
    
    public function getModule()
    {
        if ($this->_module === null) {
            $this->_module = Yii::$app->getModule('mymodule');
        }
        return $this->_module;
    }
}
 
И подключить его в моделе

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

class MyModel extends \yii\db\ActiveRecord

    use ModuleTrait;
    
    
}
 
тогда инстанс модуля будет доступен через $this->module.

В видах можно получить тот-же инстанс без всяких трейтов через контекст: $this->context->module.

Ну и всегда остается топорный вариант Yii::$app->getModule('mymodule')
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Получить модуль из модели

Сообщение zelenin »

nepster писал(а): Напомните, где вы это прочитали ?
это логика. Модель может существовать вне контекста модуля и не должна от него зависеть.
Модуль в данном контексте - это слой контроллеров. В модели не должно быть взаимодействия с контроллерами.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Получить модуль из модели

Сообщение zelenin »

nepster писал(а): Можно создать трейт:

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

trait ModuleTrait
{
    private $_module;
    
    public function getModule()
    {
        if ($this->_module === null) {
            $this->_module = Yii::$app->getModule('mymodule');
        }
        return $this->_module;
    }
}
И подключить его в моделе

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

class MyModel extends \yii\db\ActiveRecord

    use ModuleTrait;
    
    
}
тогда инстанс модуля будет доступен через $this->module.

В видах можно получить тот-же инстанс без всяких трейтов через контекст: $this->context->module.

Ну и всегда остается топорный вариант Yii::$app->getModule('mymodule')
в этом коде вы кстати не учли именно процитированный мною момент
unclead
Сообщения: 162
Зарегистрирован: 2015.03.13, 19:44

Re: Получить модуль из модели

Сообщение unclead »

В модуле можно создать класс Config, который может быть доступен через ServiceLocator, например Yii::$container, тем самым вы не будете привязаны к названию модуля и всегда будете иметь доступ к его настройкам.
Сам конечно сделал у себя по простому, через Yii::$app, но вот увидев ваш вопрос, подумал почему бы не попробовать так как описал выше.
Стоит подумать как решить момент с 2 одинаковыми модулями
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Получить модуль из модели

Сообщение zelenin »

unclead писал(а):Стоит подумать как решить момент с 2 одинаковыми модулями
с этого начинать и надо.
Почему все думают о решении, но никто не задумывается изначально о правильности? Модель не должна и ничего не знает о текущем модуле. Модель оперирует только данными. А модуль инициализируется только тогда, когда вы входите в него через контроллер. Очевидно, что не модель должна получать настройки из модуля, а какой-то сервисный слой должен передать в модель настройки. Причем настройки необязательно должны быть именно из конфига модуля. Они могут быть произвольными.
Пример: при обработке данных, переданных из формы данные из POST мы не получаем внутри модели, а передаем сами массив с данными в модель.
unclead
Сообщения: 162
Зарегистрирован: 2015.03.13, 19:44

Re: Получить модуль из модели

Сообщение unclead »

а какой-то сервисный слой должен передать в модель настройки
согласен. Я вообще сторонник принципа единой ответственности и считаю, что в самом классе AR должно быть минимум бизнес логики.
Я лишь предложил вариант с вынесением настроек в отдельный класс, а то как это уже будет дальше использоваться на совести конкретного разработчика ;)

вот тут не очень корректно
А модуль инициализируется только тогда, когда вы входите в него через контроллер.
модуль может быть прописан в bootstrap и инициализируется при инициализации приложения.Наприме, как модуль debug
Почему все думают о решении, но никто не задумывается изначально о правильности?
не стоит быт столь категоричным, это же форум, где люди иногда дают лишь наводки. Чтобы выдавать готовые красивые решения нужно время и нормальные требования. Вот мне например не очень понятна ситуация когда один и тот же модуль может потребоваться в двух экземплярах.

З.Ы. тем не менее спасибо вам за ваш ответ. Он помог мне кое что прояснить у себя в голове ;)
Последний раз редактировалось unclead 2015.05.17, 17:03, всего редактировалось 1 раз.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Получить модуль из модели

Сообщение zelenin »

unclead писал(а): вот тут не очень корректно
А модуль инициализируется только тогда, когда вы входите в него через контроллер.
модуль может быть прописан в bootstrap и инициализируется при инициализации приложения.Наприме, как модуль debug
ну и контроллеры могут быть инициализированы точно также. Но мы-то все понимаем.
модуль это а) надконтроллер б) пакет классов, реализующих общий функционал. Но б) без а) не имеет смысла, т.к. для пакета классов не нужен модуль. Поэтому в модуле главное а).
faeton
Сообщения: 88
Зарегистрирован: 2011.06.06, 01:00

Re: Получить модуль из модели

Сообщение faeton »

Два одинаковых модуля могут быть использованы если нужна схожая функциональность. к примеру есть модуль блога, который именно так и подключен на сайте. А еще нужна справка - модуль тогоже блога подходит, но требуются совсем другие настроки редактирования и другой скин на все это дело. Вот и получается два одинаковых модуля но с разными настройками.
Последний раз редактировалось faeton 2015.05.22, 18:56, всего редактировалось 1 раз.
Изображение
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Получить модуль из модели

Сообщение zelenin »

faeton писал(а):Два одинаковых модуля могут быть использованы если ружна схожая функциональность. к примеру есть модуль блога, который именно так и подключен на сайте. А еще нужна справка - модуль тогоже блога подходит, но требуются совсем другие настроки редактирования и другой скин на все это дело. Вот и получается два одинаковых модуля но с разными настройками.
но модель нельзя конфигурировать настройками модуля, т.к. использование модели возможно без модуля.
faeton
Сообщения: 88
Зарегистрирован: 2011.06.06, 01:00

Re: Получить модуль из модели

Сообщение faeton »

вот именно потому нельзя топорный вариант Yii::$app->getModule('mymodule'). Придется в контроллере передавать модели нужные настройки
Изображение
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Получить модуль из модели

Сообщение zelenin »

faeton писал(а):Придется в контроллере
"придется" несет в себе некую вынужденность. Это не вынужденность, а правильный ход.
Ответить