Для чего необходим Bootstrap в модулях ? [Решено]

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
nepster
Сообщения: 838
Зарегистрирован: 2013.01.02, 03:35

Для чего необходим Bootstrap в модулях ? [Решено]

Сообщение nepster »

Лазил по всяким решениям на yii2 и часто находил вот такие штуки:

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

<?php
...
/**
 * Site module bootstrap class.
 */
class Bootstrap implements \yii\base\BootstrapInterface
{
    /**
     * @inheritdoc
     */
    public function bootstrap($app)
    {

    }
}
...
Собственно я не совсем понял для чего это и в каких случаях нужно использовать такой подход к загрузке модулей ?
Скажем чем Bootstrap будет отличатся от:

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

...
/**
 * Site module
 */
class Module extends \yii\base\Module
{
    
    /**
     * @inheritdoc 
     */
    public function init()
    {
        parent::init();
        
        Yii::$app->getUrlManager()->addRules(
            [
                '' => 'site/default/index',
            ]
        );
        
        // Add module I18N category.
        if (!isset($app->i18n->translations['site.*'])) {
            Yii::$app->i18n->translations['site*'] = [
                'class' => 'yii\i18n\PhpMessageSource',
                'basePath' => '@frontend/modules/site/messages',
                'forceTranslation' => true,
                'fileMap' => [
                    'site.main' => 'main.php',
                ]
            ];
        }
    }
    
    ...
Последний раз редактировалось nepster 2014.11.26, 21:44, всего редактировалось 1 раз.

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Для чего необходим Bootstrap в модулях ?

Сообщение zelenin »

бутстрап нужен для тех штук, когда нужно что-то изменить/добавить до загрузки приложения или модуля. Модуль может и вообще не загрузится, а бутстрап загрузится.

Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Для чего необходим Bootstrap в модулях ?

Сообщение slavcodev »

Эта лажа архитектуры Yii, не обращай внимания. :)
Модуль не может не загрузиться. Чтоб запустить метод bootstrap, нужно создать объект модуля, а значит вызовется и init из конструктора.
Жду Yii 3!

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Для чего необходим Bootstrap в модулях ?

Сообщение zelenin »

slavcodev писал(а):Эта лажа архитектуры Yii, не обращай внимания. :)
Модуль не может не загрузиться. Чтоб запустить метод bootstrap, нужно создать объект модуля, а значит вызовется и init из конструктора.
Бутстрап к модулю вообще отношения не имеет. Что-то ты путаешь.
Класс бутстрапа загружается во время предзагрузки приложения, и загружается всегда.
Модуль загружается только тогда, когда нужен.

Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Для чего необходим Bootstrap в модулях ?

Сообщение slavcodev »

Я ничего не путаю.В первом сообщении спрашивается зачем этот метод в модуле. И да модулю можно добавить этот интерфейс и поставить в автозагрузку. Чем класс модуля отличается от других классов?

UPDATE: Я не верно понял вопрос, моя вина.
Жду Yii 3!

Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Для чего необходим Bootstrap в модулях ?

Сообщение slavcodev »

В любом случае вопрос можно поставить так: "Зачем метод bootstrap() если есть init()?". Если подсмотреть в код фреймворка

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

            if (!isset($component)) {
                $component = Yii::createObject($class);
            }

            if ($component instanceof BootstrapInterface) {
                Yii::trace("Bootstrap with " . get_class($component) . '::bootstrap()', __METHOD__);
                $component->bootstrap($this);
            } else {
                Yii::trace("Bootstrap with " . get_class($component), __METHOD__);
            } 
Что означает что объект будет создан, т.е. init() вызван, и далее bootstrap(). Идея такая, init вызывается всегда когда создается объект, bootstrap только если этот объект находится в автозагрузке приложения.
Жду Yii 3!

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Для чего необходим Bootstrap в модулях ?

Сообщение zelenin »

slavcodev писал(а):В любом случае вопрос можно поставить так: "Зачем метод bootstrap() если есть init()?". Если подсмотреть в код фреймворка

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

            if (!isset($component)) {
                $component = Yii::createObject($class);
            }

            if ($component instanceof BootstrapInterface) {
                Yii::trace("Bootstrap with " . get_class($component) . '::bootstrap()', __METHOD__);
                $component->bootstrap($this);
            } else {
                Yii::trace("Bootstrap with " . get_class($component), __METHOD__);
            }
Что означает что объект будет создан, т.е. init() вызван, и далее bootstrap(). Идея такая, init вызывается всегда когда создается объект, bootstrap только если этот объект находится в автозагрузке приложения.
вопрос в том, для чего выносят функционал в бутстрап, а не используют его в инит. Потому что бутстрап в предзагрузке и грузится всегда, а модуль инициализируется только когда нужен.

nepster
Сообщения: 838
Зарегистрирован: 2013.01.02, 03:35

Re: Для чего необходим Bootstrap в модулях ?

Сообщение nepster »

Как я понял Bootstrap меня спасет в том случае, если я например испольщую модульную структуру и появилась необходимость вызвать роут из одного модуля на другое (К примеру ссылка на всех пользователей).

А подскажите пожалуйста куда подключать файлы Bootstrap, чтобы они инициализировались ?

Аватара пользователя
VaNnOrus
Сообщения: 96
Зарегистрирован: 2014.10.09, 12:50

Re: Для чего необходим Bootstrap в модулях ?

Сообщение VaNnOrus »

Например, в настройках приложения:

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

return [
    'id' => 'bla-bla',
    'bootstrap' => [
        'backend\modules\module\Bootstrap',
    ]
] 
Можно еще в композер.джейсон, вроде, но я этим пока не пользовался.

nepster
Сообщения: 838
Зарегистрирован: 2013.01.02, 03:35

Re: Для чего необходим Bootstrap в модулях ?

Сообщение nepster »

Да это действительно работает, хотя меня сбил с толку именно bootstrap который подключается в composer.json. Как я понял это нужно использовать только для composer пакетов, тоесть yii2 сам подключает bootstrap в сгенерированном автолоаде ?

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Для чего необходим Bootstrap в модулях ?

Сообщение zelenin »

nepster писал(а):Да это действительно работает, хотя меня сбил с толку именно bootstrap который подключается в composer.json. Как я понял это нужно использовать только для composer пакетов, тоесть yii2 сам подключает bootstrap в сгенерированном автолоаде ?
в composer-пакетах мы прописываем класс бутстрапа в composer.json. При установке yii2-composer этот класс пропишет в extensions.php в раздел bootstrap расширения. Yii будет из extensions.php грузить все бутстрапы.
Если это не composer-пакет, то бутстрап надо прописывать самому в конфиг.

nepster
Сообщения: 838
Зарегистрирован: 2013.01.02, 03:35

Re: Для чего необходим Bootstrap в модулях ?

Сообщение nepster »

Большое спасибо. Все работает.

fly2k
Сообщения: 155
Зарегистрирован: 2013.03.19, 05:31

Re: Для чего необходим Bootstrap в модулях ?

Сообщение fly2k »

slavcodev писал(а):Что означает что объект будет создан, т.е. init() вызван, и далее bootstrap().
Да, но далеко не факт что будет создан объект модуля. BootstrapInterface - никаких инитов, одна единственная функция. Так что где bootstrap вынесен в отдельный(от Module) класс(обычно Bootstrap), то модуль инициализироваться не будет.
Идея такая, init вызывается всегда когда создается объект, bootstrap только если этот объект находится в автозагрузке приложения.
врядле :) init - когда создаем класс, bootstrap - когда создаем приложение... не? бутстрап - совершенно отдельная функция завёрнутая в класс. Так что использоваться может и без привязки к каким либо "настоящим" классам. Но это не мешает "настоящему" классу(например модулю) определить такю функцию(class Module ... implements BootstrapIntarface) - тогда конечно да, там может быть сколько угодно init'ов и тд и тп...

Вот я тут подробнее разбирался: http://www.yiiframework.ru/forum/viewto ... 19&t=20771

Для меня пока основная польза от бутстрап в модулях - это подрихтовать urlManager и подцепить файлы переводов. Даже не представляю, где бы я это еще делал, если не в бутстрапе от модуля - только в конфиге/коде приложения, наверное...
// Yii2Rulez!

Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Для чего необходим Bootstrap в модулях ? [Решено]

Сообщение slavcodev »

Два раза перечитал, так и не понял, ты подтверждаешь мои цитаты или опровергаешь :)
Жду Yii 3!

fly2k
Сообщения: 155
Зарегистрирован: 2013.03.19, 05:31

Re: Для чего необходим Bootstrap в модулях ? [Решено]

Сообщение fly2k »

Что означает что объект будет создан
это подтверждаю, но всё остальное опровергаю ;)
Два раза перечитал
ну прочитай код один раз - там меньше буков чем у меня ;) Вызывается функция bootstrap(). Если эта функция прописана отдельно от модуля(напр. в Bootstrap.php) и об этом сказано в composer.json extra:bootstrap, то сработает это, то есть будет создан экземпляр класса Bootstrap в котором ничего кроме bootstrap() просто нет... Конструктор никакой не определён, так что и никакого init() нет.

Он(инит) вообще отсюда. Так что, если класс бутстрапа наследник Object, то да - там можно говорить об init(), а так - не уместно :geek: Ну и вообще, функцию bootstrap() может иметь сколь угодно жирный класс, в том числе и класс модуля.

И вот если модуль умеет bootstrap, и он прописан в app::bootstrap, то он сработает уже тут. В этом случае в composer.json ничего прописывать не нада. И вот тут всё слово в слово: "объект будет создан, т.е. init() вызван, и далее bootstrap()". Но это лишь частный случай, так что утверждение:
init вызывается всегда когда создается объект, bootstrap только если этот объект находится в автозагрузке приложения"
просто напрашивается на опровержение :ugeek:
// Yii2Rulez!

Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: Для чего необходим Bootstrap в модулях ? [Решено]

Сообщение slavcodev »

Твое опровержение не имеет смысла. Вопрос был задан "Для чего bootstrap() в модулях если есть init()".

И я продолжаю утверждать что init() вызывается всегда когда вызван конструктор, bootstrap() объекта будет вызван только если объект в автозагрузке приложения (не важно композером он был туда установлен, либо через конфиг приложения).

Твои ссылки на исходники только подтверждают то что я написал, но возможно неважно объясняю.
Жду Yii 3!

fly2k
Сообщения: 155
Зарегистрирован: 2013.03.19, 05:31

Re: Для чего необходим Bootstrap в модулях ? [Решено]

Сообщение fly2k »

Вопрос был задан "Для чего bootstrap() в модулях если есть init()
Такого нигде не нашел... есть "Для чего необходим Bootstrap в модулях?" и в теле очевидный пример Bootstrap.php без каких либо init()
Твое опровержение не имеет смысла
Похоже на то :(

Но попытаюсь еще разок, и ты не сочкуй. Прочитай еще раз самое первое сообщение в теме. Там два класса - Bootstrap и Module.
В первом нет ничего кроме bootstrap(). init() нигде не определён, ровно как и конструктор, который бы дёргал init(). Объект именно этого класса создаётся при бутстрапе. А объект класса Module может быть вообще не создан если не понадобится.

Так что как раз конкретно по примеру топикстартера: объект модуля при бутстрапе НЕ будет создан! Никаких init() вызвано НЕ будет. Будет создан обект класса Bootstrap и дернется его единственная функция bootstrap($app).

"Поздравляю вас, гражданин, соврамши!" (с)

ЗЫ. Вообще, всё больше вранья как то видится, уже не верится в непонимание. Человек разбирается, а ты его запутываешь, сбиваешь, да еще подсираешь с порога - лажа архитектуры Yii, типо! Неужели и тут black-pr? :o
// Yii2Rulez!

Ответить