Yii+namespaces и запуск 2-х контроллеров за 1 запрос

Есть следующая структура папок

/protected

[list]

/components

[list]

	Controller.php

[/list]

/controllers

[list]

	MyController.php

[/list]

/modules

[list]

	/mymodule

[list]

		/components

[list]

			Controller.php







		/controllers






			MyController.php







		MyModule.php

[/list]

[/list]

[/list]

[/list]

Исходники файлов:

/protected/components/Controller.php




class Controller extends CController

{}



/protected/controllers/MyController.php




class MyController extends Controller

{

	public function actionIndex()

	{}

}



/modules/mymodule/components/Controller.php




namespace mymodule\components


class Controller extends \CController

{}



/modules/mymodule/controllers/MyController.php




namespace mymodule\controllers


class MyController extends \mymodule\components\Controller

{

	public function actionIndex()

	{}

}



/modules/mymodule/MyModule.php




class MyModule extends CWebModule

{

	public function init()

	{

		$this->setImport(array(

			'mymodule.components.*',

		));

	}

}



Следующий код приводит к ошибке:




Yii::app()->runController('mymodule/my/index');

Yii::app()->runController('my/index');



Fatal error: Cannot redeclare class mymodule\components\Controller in /protected/modules/mymodule/components/Controller.php on line 0

Проблема в том, что при попытке заавтолоудить класс Controller подгружается /modules/mymodule/components/Controller.php, который попадает под импорт ‘mymodule.components.*’, но не содержит класс Controller и более того содержит уже подгруженный файл.

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

Собственно вижу 2 решения:

  • переименовать класс и его файл \mymodule\components\Controller во что-нить другое;

  • сделать namespace для класса Controller

Если кто-то знает более элегантное решение, с удовольствием бы послушал.

Так же надеюсь, что бага дойдет до рабработчиков фремворка.

Вроде писали что поддержка namespace должна появится только в Yii 2.0…

Про использование namespace тут

Вот тут чуть подробнее: http://rmcreative.ru/blog/post/yii-avtozagruzka-bibliotek--ispolzujuschikh-namespace

Это со следующим релизом в документацию попадёт, но работало всегда именно так.

Спасибо, а то я как-то совсем забыл про такой приём

Что-то мне написанное выше не помогло решить проблему с помещением контроллера модуля в namespace.

Фэйл случается в методе CWebApplication.runController(), строке 346, где повторно вызывается функция class_exists. В предыдущей строке файл контроллера успешно подключается, а вот проверка на наличие класса с именем MyController не проходит, потому что в глобальном namespace его нет.

Лечится удалением namespace …; из файла контроллера.

Может быть уже не по теме, но заметил еще одну неприятность: если поместить модель в namespace и передавать объект в active-методы CHtml, то имена у элементов формы получаются вида foo\bar\ModelName, т.к. CHtml вызывает метод get_class(), возвращающий полное имя класса вместе с пространством имен. В итоге ни к чему хорошему это не приводит. Так что поддержку пространств имен в Yii еще допиливать и допиливать, а пока можно только обычные классики подключать, что уже радует :)