Расширение IndexController с помощью BaseController в Zend

Я пытаюсь расширить мои контроллеры с помощью глобального базового контроллера:

class BaseController extends Zend_Controller_Action { // common controller actions public function listAction() { // do stuff } } class IndexController extends BaseController { // index controller specific actions } class LoginController extends BaseController { // login controller specific actions } 

Но я получаю эту ошибку: PHP Неустранимая ошибка: Class 'BaseController' не найден в /var/www/Zend/project/application/controllers/IndexController.php в строке 3

Любые идеи о том, как заставить Zend «видеть» этот контроллер?

автопогрузчик

Установите автозагрузчик и зарегистрируйте свою библиотеку, которая должна быть, помимо библиотеки Zend, автозагрузчиком, как это делается (в вашем bootstrap.php после установки пути включения):

 //AutoLoad loads classes automatically if they are used require_once 'Zend/Loader/Autoloader.php'; $loader = Zend_Loader_Autoloader::getInstance(); $loader->registerNamespace('Mylibrary_'); 

Соглашения об именах Zend

Затем вы должны переименовать свой BaseController следующим образом

 /Zend (folder) /Mylibrary (folder) /Controller (folder) Action.php <-- this is your basecontroller file 

который содержит:

 class Mylibrary_Controller_Action extends Zend_Controller_Action { } 

и ваши обычные контроллеры в папке контроллера:

 class IndexController extends Mylibrary_Controller_Action { } 

поэтому в основном, когда вы хотите расширить структуру, вы сохраняете параллельную структуру в своей собственной библиотеке.

Я бы разделил его на свою собственную библиотеку, т. Е. Создал файловую библиотеку / YourApp / Controller / Action.php и, следовательно, назовите ее, то YourApp_Controller_Action extends Zend_Controller_Action . Оттуда вы могли бы разместить контроллеры там, где они должны быть, и позволить им расширять YourApp_Controller_Action в пользу Zend_Controller_Action .

Чтобы найти файл, вы должны полагаться на автозагрузчик, чтобы смотреть не только внутри библиотеки / Zend, но и в библиотеке / YourApp. Т.е. ищите set_include_path в вашем бутстрапе.

С помощью этой техники вы должны иметь в виду, что ваш пользовательский «базовый контролер» может раздуться с методами, которые не все наследуемые контроллеры должны унаследовать.

Еще более быстрое решение (и концептуально более корректное) – это НЕ создавать базовые контроллеры вообще 🙂

У вас есть общее действие? Используйте помощники действий . У вас есть некоторые функции, которые должны быть автозапуском? Используйте плагины контроллера .

По дизайну ZF-контроллеры были сделаны как можно более гибкими, и ограничение себя по наследству (и его соединение) – это не самая лучшая стратегия.

быстрое решение, не использующее функциональность автозагрузчика, – require_once '/path/to/BaseController.php' в файле index-controller.

Если у вас настроенный автоконтроллер, он не может его найти, поэтому вам стоит подумать о том, что не так. Попробуйте предыдущий подход и сообщите о результатах.