yii2 события в контроллерах

Есть два модуля - Comments и Pages со своей структурой, т.е. реализация не стандартная как по умолчанию в Yii2.

Соответственно два контроллера


class CommentsController extends BaseController

{            

    public function actionIndex()

    {

        return $this->render('index');

    }

}


Event::on(PagesController::className(), PagesController::EVENT_GET_COMMENTS, 

function ($event) {

       echo 'comments';

    });

ну и аналогично для Pages


class PagesController extends BaseController

{   

    const EVENT_GET_COMMENTS = '';


    public function actionIndex()

    {

        $this->trigger(self::EVENT_GET_COMMENTS);


        return $this->render('index');

    }

}

В теории при вызове контроллера Pages действия index должно срабатывать событие EVENT_GET_COMMENTS и выводиться comments, но этого не происходит :(

Знающие люди подсказали, что это происходит из-за следующего:

Т.е. контроллер создается на лету так сказать. Отсюда вопрос, можно ли загружать все контроллеры автоматом при старте приложения или как вообще лучше поступить в данном случае ?

Я не понял, где вы объявляете хэндлер событий. Прямо после объявления CommentsController в том же файле?

Да, в том же файле. Я ж говорю, не знаю как лучше поступить в данном случае. Как вариант думал в каждом модуле сделать файл Events.php и добавлять их в автозагрузку, но не уверен, делает ли так кто-то. В идеале конечно вообще обойтись без лишних файлов(велосипедов). Я не знаю кто как использует события в Yii, в моем же случае я просто хочу гонять данные с одного модуля в другой, при этом сохраняя минимальную связанность.

Тогда устанавливайте хэндлеры событий в методе init() второго модуля, например. Если он подключен, то он таким образом во время инициализации будет "подписываться" на них.

Дело в том что это не совсем модуль как бы. Т.е. структура модульная, но сама реализация иная. Собственно весь сыр бор из-за того что я не нашел решения как нормально разделить модуль, тот что в Yii по умолчанию, на пользовательскую/административную часть.

Сложно что-либо советовать без понимания архитектуры. Я дал совет для классической реализации модулей Yii2: http://www.yiiframework.com/doc-2.0/guide-structure-modules.html

У таких модулей есть функция init(), в которой удобно назначать хэндлеры событий и делать прочие вещи уровня инициализации.

А пример не подкинете, а то что-то совсем не получается, не видят они друга друга и все тут :(

Какой именно код не работает? Что не получается?

Есть два модуля Test и Test2


   

'modules' => [

        'test' => [

            'class' => 'app\modules\test\Module',

        ],

        'test2' => [

            'class' => 'app\modules\test2\Module',

        ],

    ]



Модуль Test




<?php


namespace app\modules\test;


use yii\base\Event;


class Module extends \yii\base\Module

{

    public $controllerNamespace = 'app\modules\test\controllers';

    

    const EVENT_TEST = 'test';

    

    public function init()

    {

        parent::init();


        // custom initialization code goes here

        Event::trigger(self::EVENT_TEST, $event);

    }

}



Модуль Test2




<?php


namespace app\modules\test2;


use yii\base\Event;


class Module extends \yii\base\Module

{

    public $controllerNamespace = 'app\modules\test2\controllers';


    public function init()

    {

        parent::init();


        // custom initialization code goes here

        Event::on(\app\modules\test\Module::className(), \app\modules\test\Module::EVENT_TEST, 

        function ($event) {

               echo 'test2';

            });

    }

}



Обращаясь к “Test”, в теории должен получить ‘test2’, но этого не происходит, понимаю что-то не так делаю, но что не пойму

Чтобы произошла подписка второго модуля на события первого, в нём должен произойти вызов функции init(). Возможно, второй модуль ещё не инициализирован к тому моменту, когда вы начинаете инициализировать первый. Таким образом, происходит выброс события, но его слушатель ещё не установлен.

А каким образом его инициализировать ? Не через require же его подключать :(