Расширение 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 "видеть" этот контроллер?

Ответ 1

Автозагрузка

Установите автозагрузчик и зарегистрируйте свою библиотеку, которая должна быть, помимо библиотеки 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
{
}

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

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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