Есть два модуля - 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, но этого не происходит
Знающие люди подсказали, что это происходит из-за следующего:
Т.е. контроллер создается на лету так сказать. Отсюда вопрос, можно ли загружать все контроллеры автоматом при старте приложения или как вообще лучше поступить в данном случае ?
Да, в том же файле. Я ж говорю, не знаю как лучше поступить в данном случае. Как вариант думал в каждом модуле сделать файл Events.php и добавлять их в автозагрузку, но не уверен, делает ли так кто-то. В идеале конечно вообще обойтись без лишних файлов(велосипедов). Я не знаю кто как использует события в Yii, в моем же случае я просто хочу гонять данные с одного модуля в другой, при этом сохраняя минимальную связанность.
Тогда устанавливайте хэндлеры событий в методе init() второго модуля, например. Если он подключен, то он таким образом во время инициализации будет "подписываться" на них.
Дело в том что это не совсем модуль как бы. Т.е. структура модульная, но сама реализация иная. Собственно весь сыр бор из-за того что я не нашел решения как нормально разделить модуль, тот что в Yii по умолчанию, на пользовательскую/административную часть.
<?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(). Возможно, второй модуль ещё не инициализирован к тому моменту, когда вы начинаете инициализировать первый. Таким образом, происходит выброс события, но его слушатель ещё не установлен.