Yii - Наследование От Пользовательского Класса Контроллера - Не Найдено
class SomeController extends Controller
{
public function actionIndex() {
echo 'This is some controller';
}
}
class AnotherController extends SomeController
{
public function actionIndex() {
echo 'This is another controller';
}
}
Это работает:
index.php?r=some
Но...
index.php?r=another
Говорит:
Предупреждение PHP
Включить(SomeController.php ): не удалось открыть поток: Нет такого файла или каталога
Оба файла находятся в
test\protected\controllers\
Кстати, в прошлом я также пытался использовать генератор контроллера Gii с "someController" в качестве базового класса...
Там было сказано:
The controller has been generated successfully. You may try it now.
Generating code using template
"C:\xampp\htdocs\yii\framework\gii\generators\controller\templates\default"...
generated controllers\YetAnotherController.php
generated views\yetAnother\index.php
done!
Когда я нажал "попробуйте сейчас", он также сказал:
Предупреждение PHP
Включить(SomeController.php ): не удалось открыть поток: Нет такого файла или каталога
2 answers
Редактировать:
Классы внутри защищенные/контроллеры не загружаются автоматически, поэтому вам придется импортировать файл родительского класса перед расширением из него:
В AnotherController.php:
Yii::import('application.controllers.SomeController');
public class AnotherController extends SomeController {
// ...
}
Если вам также необходимо получить доступ к базовому классу по URL-адресу, вы можете использовать описанный выше метод. В противном случае вы можете поместить свой базовый класс в защищенный/компоненты, как вы уже поняли.
Автоматическая загрузка Yii работает только тогда, когда у вас есть то же имя файла, что и у класса, содержащегося в файле. Значение class SomeController
должно быть в пределах SomeController.php файл.
Внесите эти изменения, и это должно сработать.
Полезная вики-страница: Понимание вспомогательных классов автоматической загрузки и вспомогательных функций.
Файлы классов должны быть названы в честь открытого класса, который они содержат.
Чтобы расширить любой класс, просто перейдите в файл конфигурации и добавьте класс в раздел импорта
'import' => array('application.controllers.SomeController')
Это сделает его доступным во всем приложении без явного импорта.