Существуют два разных модуля, например, admin и catalog, в них контроллеры с одинаковыми именами DefaultController. В DefaultController’e модуля admin хочу вызвать метод testDefaultController’а модуля Catalog следующим образом:
public function actionIndex()
{
$c = Yii::app()->createController('catalog/dafault');
$c[0]->test();
}
Но в результате в $c попадает DefaultController модуля admin (а не необходимого мне, catalog) и там, соответственно, никакого метода test нет. При переименовании контроллеров проблема пропадает.
Не уверен, но похоже без namespace которых в 5.3 еще нет это не разрулить. Не может же быть два класса с одинаковым именем.
А зачем тебе вызывать метод другого контроллера? Это пахнет плохим кодом.
Можно сделать редирект на другой контроллер, или вынести общий функционал куда-то в отдельный файл, в модель или в action который сможешь подключить к обоим контроллерам.
Замут в следующем: модуль admin обращается к каким то экшенам модуля catalog, например (create, delete), которые принадлежат СategoryController. Я посчитал что это правильное решения, весь функционал работы с каталогом хранить, непосредственно, в модуле catalog. А остальное разруливать на уровне доступа к экшенам. Что-то похожее видел в modx revo. В принципе мне это решение понравилось. Хотя может я и не прав.
А вот насчёт “Не может же быть два класса с одинаковым именем”, я считаю что когда ведётся разработка разных модулей разными людьми, которые мало знают о действиях каждого, то есть вероятность, что именование классов у них будет совпадать. Но решение наверняка существует, просто малый опыт работы с yii не позволяет его применить
Мне кажется, что ограничения РНР 5.3 мешают такой стратегии.
Я вообще почти не пользуюсь модулями, потому что по настоящему сделать их независимыми друг от друга делать очень утомительно. А от связанных между собой модулей кажется толку нет, одно гордое название "модуль".