Задать вопрос
usdglander
@usdglander
Yipee-ki-yay

Как менять пространство имен налету?

Добрый день!
Возможно вопрос нубский, но я что то потерялся. Даже не знаю как его гуглу сформулировать.
Есть проект на Yii2 на advanced-шаблоне. Во frontend есть модули с пространством имен:
namespace app\modules\<имя модуля>\...;
Необходимо по cron'у пробегаться по модулям и вызывать actionCron из контроллера если он реализован. Так как wget'ом вызывать такие экшены опасно (лимит в 30 секунд), то в console создан CronController со всеми вытекающими типа namespace console\controllers. controllerMap (для вызова через run()) использовать не хотелось бы, так как заранее неизвестен набор модулей. Прибегнул к такому трюку:
public function actionExec()
	{
		$plugins = \common\models\Plugins::find()->all();
		foreach ($plugins as $plugin) {
			$controller = 'frontend\\modules\\' . $plugin->name . '\\controllers\\CronController';
			if (class_exists($controller))
			{
				$obj = new $controller($plugin->name, $plugin->name);
				$result = $obj->actionIndex($plugin);
			};
		}
	}

Вызовы проходят, но вот внутренние обращения к моделям, имеющим app\modules\... в качестве namespace выдают:
PHP Fatal Error 'yii\base\ErrorException' with message 'Class 'app\modules\events\models\EventsUser' not found'

Так не хочется менять все app на frontend...
Вопрос: Можно ли заставить консольное приложение думать, что app - это frontend? Или я где то кардинально ошибся?
  • Вопрос задан
  • 214 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
То есть, в каталогах 'frontend\modules\<имя модуля>', располагаются модули с пространствами имен 'app\modules\<имя модуля>'?
Можно переопределить '@app' при помощи Yii::setAlias().
Но лучше привести пространства имен в порядок.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы