Есть следующая структура папок
/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
Если кто-то знает более элегантное решение, с удовольствием бы послушал.
Так же надеюсь, что бага дойдет до рабработчиков фремворка.